免费的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中出现问题

很明显,这个答案是错误的 。 我将把它留在这里,以保留评论中有价值的讨论,直到有人提出正确的答案。


考虑SetSet的功率。 如果我们有一个函数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 >>=如何定义任何东西?

Interesting Posts