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)
之类的东西