为什么连接是独立的,而不是Monad类型类的最小实现的一部分?

Nic*_*nin 14 haskell

我更喜欢通过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.


Dan*_*ner 7

join是不是Monad因为它会打破GeneralizedNewtypeDeriving在NEWTYPE包裹的单子变压器,一个很常见的情况一种微妙的方式.有关详细信息,请参阅GHC wiki.