我更喜欢通过join函数定义一个Monad实例,而不是>>=......从等价开始:
x >>= f = join (fmap f x)
Run Code Online (Sandbox Code Playgroud)
你能用连接定义一个Monad实例吗?
我原本希望加入Monad: {-# MINIMAL (>>=)| join #-}
为什么join在顶级而不是在Monad类型类中?
Ale*_*ing 23
遗憾的是,由于与广义新类型派生和角色系统相关的技术限制,GHC标准库join中的Monad类型类不是其中的一部分.给予一定的NEWTYPE长话短说,newtype T m a = MkT (m a),GHC是不是足够聪明,想出如何证明之间代表性的平等m (m a)和m (T m a),这是必要的证明了的第一个参数表征平等join(其类型m (m a) -> m a).
幸运的是,最近对GHC Haskell的扩展QuantifiedConstraints可能使角色系统足够智能化以支持这一点.有关问题及其潜在解决方案的更详细处理,请参阅Ryan Scott的博客文章,量化约束如何让我们重新加入Monad.