【发布时间】:2016-03-27 16:17:07
【问题描述】:
在 Haskell 中,monad 是根据函数 return 和 bind 定义的,其中 return 的类型为 a -> m a,bind 的类型为 m a -> (a -> m b) -> m b。在monads can also be defined in terms of return and join 之前已经指出,其中join 是一个类型为m (m a) -> m a 的函数。绑定可以根据连接来定义,但是反过来可能吗? join可以用bind来定义吗?
如果没有加入,我不知道如果我以某种方式获得了“两次包装”的单子值,我会做什么,m (m a) - 没有任何仿函数或单子操作“删除任何层”,可以这么说.如果这是不可能的,为什么 Haskell 和许多其他 monad 实现用绑定来定义它们?严格来说,它似乎不如基于连接的定义有用。
【问题讨论】:
-
注意“也”:如果无法根据绑定来定义连接,则它必须成为
Monad的成员(或者不会被定义)适用于所有单子),但事实并非如此。