假设,所有单子都可以用Free
(如果这不是真的,什么是反例,为什么)?如何使用or来表达延续单子或其对应的转换器- 对应的函子是什么?或者如果他们不能,原因是什么?Free
FreeT
更新:表达我的意思是基本上同构于Free F
F
我们正在寻找的仿函数where is,例如Writer w
同构于Free ((,) w)
.
延续单子是您正在寻找的反例。我没有足够的知识来提供完整的证明,但我会给你一些参考资料以供查找。
这个想法是单子有一个与之相关的“等级”概念。“等级”大致表示提供 monad 的全部功能所需的操作数。
我怀疑,除了延续派生的 monad 之外,我们在 Haskell 中处理的所有 monad 都有等级,例如Identity
, Maybe
, State s
, Either e
, ..., 以及它们通过转换器的组合。例如,Identity
由无操作生成,Maybe
由Nothing
、State s
由get
和由生成。(也许这表明它们实际上都有有限的排名,或者可能对每个 都算作不同的操作,所以大小的排名也是如此,我不确定。)put s
Either e
Left e
put s
s
State s
s
自由单子当然有等级,因为Free f
它是由 . 编码的操作显式生成的f
。
这是排名的技术定义,但不是很有启发性: http://journals.cambridge.org/action/displayAbstract?aid= 4759448
在这里你可以看到延续单子没有等级的说法:http ://www.cs.bham.ac.uk/~hxt/cw04/hyland.pdf 。我不确定他们是如何证明这一点的,但这意味着延续单子不是由任何操作集合生成的,因此不能表示为自由单子的(商)。
希望有人能来整理我的技术细节,但这是你想要的证明的结构。
这是一个愚蠢的答案,表明您的问题和我之前的答案都需要工作。
Cont
可以很容易地用 表示Free
:
import Control.Monad.Free
import Control.Monad.Trans.Cont
type Cont' r = Free (Cont r)
quotient :: Cont' r a -> Cont r a
quotient = retract
Cont
是(当然)自由单子本身的(商)。所以现在你必须准确地澄清你所说的“表达”是什么意思。
请参阅我对您去年提出的问题的回答。让我们考虑r = Bool
(或更一般地说,任何r
承认非平凡自同构的类型)。
m
将(直到 newtype 包装器)定义为m :: (() -> Bool) -> Bool; m f = not (f ())
. 然后m
是不平凡的,但是m >> m
是平凡的。所以Cont Bool
不与自由单子同构。
Haskell 中的完整计算:
rwbarton@morphism:/tmp$ ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> import Control.Monad.Cont
Prelude Control.Monad.Cont> let m :: Cont Bool (); m = ContT (\f -> fmap not (f ()))
Loading package transformers-0.3.0.0 ... linking ... done.
Prelude Control.Monad.Cont> runCont m (const False) -- m not trivial
True
Prelude Control.Monad.Cont> runCont (m >> m) (const False)
False
Prelude Control.Monad.Cont> runCont (m >> m) (const True) -- (m >> m) trivial
True
这里有几个小证据,证明不存在一个Functor f
这样的,对于所有人来说a :: *
,m :: * -> *
FreeT f m a
相当于ContT r m a
使用FreeT
.
让m :: * -> *
这样没有实例Functor m
。由于instance Functor (ContT r m)
有一个实例Functor (ConT r m)
。如果ContT r
和FreeT f
是等价的,我们会期望Functor (FreeT f m)
。但是,使用 , 的正常解释FreeT
,instance (Functor f, Functor m) => Functor (FreeT f m)
没有Functor (FreeT f m)
实例,因为没有Functor m
实例。(我放宽了FreeT
从 requiresMonad m
到 only requires 的正常解释,Functor m
因为它只使用liftM
.)
让m :: * -> *
这样没有实例Monad m
。由于instance Monad (ContT r m)
有一个实例Monad (ConT r m)
。如果ContT r
和FreeT f
是等价的,我们会期望Monad (FreeT f m)
。但是,使用 , 的正常解释FreeT
,instance (Functor f, Monad m) => Monad (FreeT f m)
没有Monad (FreeT f m)
实例,因为没有Monad m
实例。
如果我们不想使用 or 的正常解释,Free
我们FreeT
可以拼凑出类似Cont r
or的怪物ContT r
。例如,有一个Functor (f r)
这样Free (f r) a
可以等同于Cont r a
使用 的异常解释Free
,即Cont r
它自己。