免费的monad是否永远存在?
我们从类别理论中知道,并非Set中的所有pipe理者都承认自由单子。 规范的反例是powerset函子。
但是Haskell可以把任何函子变成一个免费的monad。
data Free fa = Pure a | Free (f (Free fa)) instance Functor f => Monad (Free f) where return = Pure Pure a >>= f = fa Free m >>= f = Free ((>>= f) <$> m)
是什么让这个构造对于任何Haskell函数起作用,但在Set中出现问题 ?
很明显,这个答案是错误的 。 我将把它留在这里,以保留评论中有价值的讨论,直到有人提出正确的答案。
考虑Set
中Set
的功率。 如果我们有一个函数f : S -> T
,我们可以由f' X = f [X]
形成f' : PS S -> PS T
好协变函数(我认为)。 我们也可以形成f'' X = f^(-1) [X]
,一个很好的逆变函数(我认为)。
让我们来看看Haskell中的“权力集合”:
newtype PS t = PS (t -> Bool)
这不是一个Functor
,而只是一个Contravariant
:
instance Contravariant PS where contramap f (PS g) = PS (g . f)
我们认识到这一点,因为t
是负面的。 不同于Set
,我们不能得到组成幂集的特征函数的“元素”,所以协变函子是不可用的。
因此,我猜想Haskell承认每个协变函数都有一个自由monad的原因是它排除了那些为Set
产生麻烦的协变函子。
我(有)怀疑这不完全是一个定义。 说,这个recursion公式指定一个不动点; 现在,我们如何知道这个固定点存在? 我们如何知道只有一个固定点? 还有,除了可能在假设我们只有有限序列的Free
的应用程序的情况下, Free m >>=
如何定义任何东西?