问题说明 Link to heading

在理解 monad 时想到的部分,为什么 haskell 定义 monad 时要使用 a -> m b 作为输入函数?

什么是单子 Link to heading

自函子范畴的幺半群。

Haskell 现有的定义 Link to heading

现在的 monad 定义无疑是符合单子的定义。a -> m b 是对象,purereturn)是幺元,多个 >>= 操作是可结合的。

其它定义 Link to heading

除现有定义外,还有其它合适的定义,比如通过 joinpure

为什么对象是 a -> m b Link to heading

如果对象是 a -> bm a -> m b 时,在现有定义下也可以通过 Functor 来完成相应的行为,并有 monoid 的定义。但使用这种定义我们就无法对返回值进行更进一步的控制。考虑 Either,我们对返回的是用 Left 还是 Right 呢?这两者均属于 Either 这个范畴内,可是最终只有一个被使用了。换句说话,我们没办法 =look inside=,即除了值以外的信息被丢弃了。

参考 Link to heading