Haskell 如何使用自由单子表示延续单子?
据推测,所有单子都可以用Haskell 如何使用自由单子表示延续单子?,haskell,monads,continuations,free-monad,Haskell,Monads,Continuations,Free Monad,据推测,所有单子都可以用Free表示(如果不是这样,反例是什么,为什么)?如何使用或来表示或其对应的变换器-对应的函子是什么?或者如果他们不能,原因是什么 更新:我所说的expressed是指基本上同构于Free F,其中F是我们正在寻找的一个函子,例如Writer w同构于Free(,)w)延续单子是您正在寻找的反例。我没有足够的知识来提供一个完整的证据,但我会给你一些参考资料以供查阅 这个想法是单子有一个与之相关的“等级”概念。“等级”大致意思是 提供monad的全部功能所需的操作数 我怀疑
Free
表示(如果不是这样,反例是什么,为什么)?如何使用或来表示或其对应的变换器-对应的函子是什么?或者如果他们不能,原因是什么
更新:我所说的expressed是指基本上同构于Free F
,其中F
是我们正在寻找的一个函子,例如Writer w
同构于Free(,)w)
延续单子是您正在寻找的反例。我没有足够的知识来提供一个完整的证据,但我会给你一些参考资料以供查阅
这个想法是单子有一个与之相关的“等级”概念。“等级”大致意思是
提供monad的全部功能所需的操作数
我怀疑,除了延拓派生的单子之外,我们在Haskell中处理的所有单子都有秩,例如,标识
,可能
,状态
,或者e
,…,以及它们通过变换器的组合。例如,标识
不通过任何操作生成,可能
由无
生成,状态s
由获取
和放置s
和或e
由左e
生成。(也许这表明它们实际上都有有限的秩,或者,put s
对每个s
计算为不同的操作,因此状态s
的秩大小为s
,我不确定。)
自由单子当然有秩,因为freeff
是由f
编码的操作显式生成的
以下是等级的技术定义,但不是很有启发性:
在这里,您可以看到延续单子没有秩的声明:。我不确定他们是如何证明这一点的,但这意味着延续单子不是由任何操作集合生成的,因此不能表示为自由单子的商
希望有人能过来整理一下我的技术问题,但是这就是你想要的证明的结构。这里有两个小小的证明,证明不存在一个
函子f
,这样对于所有a:*
和m:*->*
freetfma
使用FreeT
的正常解释就相当于conttrma
让m::*->*
这样就没有实例函子m
。由于实例函子(ContT r m)
存在一个实例函子(ConT r m)
。如果conttr
和freetf
是等价的,我们期望函子(freetfm)
。然而,使用FreeT
,实例(函子f,函子m)=>函子(FreeT fm)
的正常解释,没有函子(FreeT fm)
实例,因为没有函子m
实例。(我将FreeT
的正常解释从要求Monad m
放宽为只要求Functor m
,因为它只使用liftM
)
让m::*->*
这样就没有实例Monad m
。由于实例Monad(ContT r m)
存在一个实例Monad(ConT r m)
。如果conttr
和freetf
是等价的,我们期望Monad(freetfm)
。然而,使用FreeT
,实例(函子f,单子m)=>Monad(FreeT fm)
的正常解释,没有Monad(FreeT fm)
实例,因为没有Monad m
实例
如果我们不想使用
Free
或FreeT
的正常解释,我们可以拼凑出像contr
或contr
一样工作的怪物。例如,有一个函子(fr)
,Free(fr)a
可以等价于contr a
,使用Free
的异常解释,即contr
本身。这里有一个愚蠢的答案,表明你的问题和我先前的答案都需要解决
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=布尔-< /代码>(或者更一般地说,任何类型的<代码> r>代码>,它承认一个非平凡的自同构。
将m
(最多新类型包装器)定义为m:(()->Bool)->Bool;mf=not(f())
。那么m
是不平凡的,但是m>>m
是微不足道的。因此,contbool
与自由单子不同构
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
第二篇论文肯定地断言,连续单子没有秩,不能将连续单子与其他许多单子求和,但我找不到一个论点,证明它不是自由单子的像/商。在我看来,把第一篇关于排名的论文称为“不是很有启发性”似乎是一种轻描淡写的说法!你能帮点忙吗?你好,安德鲁。所需的组件应该是单子的商的秩不大于原始值。但我不知道如何证明这一点。关于职级的具体情况,恐怕我不能提供更多的信息。参考资料很难获得,我对“生成所需的操作数”只有直观的理解。我不知道这是否正确,虽然我认为它接近正确。我会小心将这种基数论点从集合转移到哈斯克。毕竟Hask承认了诸如类型
newtypex=X(X->Bool)
之类的东西