续延单子就是你要找的反例。我不太了解,无法提供完整证明,但我会给你一些参考。
想法是单子与其关联的“级别”概念。 “等级”大致意味着提供单子的全部功能所需的操作数量。
我怀疑,除了续延衍生单子之外,在Haskell中处理的所有单子都具有等级,例如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
在这里,您可以看到关于 continuation monad 没有秩的说法:http://www.cs.bham.ac.uk/~hxt/cw04/hyland.pdf。我不确定他们是如何证明的,但是暗示着 continuation monad 不是通过任意一组操作生成的,因此不能被表示为(自由 monad 的商)。
希望有人能够理清我的技术问题,但这就是您想要证明的结构。
newtype X = X(X-> Bool)
之类的东西,它满足同构X〜(X-> Bool)
,这对于任何集合来说都是不可能的,因为基数的原因。 - Reid BartonX
中展示的行为可能发生在函子数据类型中,对吗?我认为您需要非正性才能做到这种事情。 - Tom Ellisnewtype X = X ((X -> Bool) -> Bool)
也存在同样的情况,它是一个函子的不动点。为了在集合中存在这个不动点,该函子需要严格正(或更一般地说,可达)。 - Reid Bartonimport Control.Monad.Free
import Control.Monad.Trans.Cont
type Cont' r = Free (Cont r)
quotient :: Cont' r a -> Cont r a
quotient = retract
Cont
是自由单子在自己上的(商),所以现在您需要明确“表达”是什么意思。
Free f
同构,就像Maybe
与Free MaybeF
同构一样,其中data MaybeF a = MaybeF
等。我会更新问题。 - PetrMaybe
不是同构于 Free MaybeF
,而只是它的商。 - Tom Ellisdata MaybeF a = Nada
,则 Maybe
同构于 Free MaybeF
。 - Reid BartonFree f
,其中f
是某个生成操作的函子,而仅仅是它的商。你在这个答案中用State
的例子也提到了同样的观点:https://dev59.com/SmUq5IYBdhLWcg3wQ-Xk#24918234 - Tom Ellis请查看去年你的问题的我的回答。让我们考虑r = Bool
(或更一般地,任何允许非平凡自同构的类型r
)。
将m
(新类型包装除外)定义为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
设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 m
实例,因此没有Functor (FreeT f m)
实例。(我放松了对FreeT
的正常解释,只要求Functor m
,而不是要求Monad 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 m
实例,所以也就没有 Monad (FreeT f m)
实例。Free
或 FreeT
的正常解释,我们可以拼凑出像 Cont r
或 ContT r
一样工作的怪物。例如,存在一个 Functor (f r)
,使得使用 Free (f r) a
的异常解释,即 Cont r
本身,可以等价于 Cont r a
。
Writer w
并不同构于Free ((,) w)
,仅仅是它的商。毕竟,Writer w
就是((,) w)
。此外,正如我下面所证明的那样,Cont r
同构于Free (Cont r)
的商。你能进一步澄清吗? - Tom Ellis