首页 > 解决方案 > 为什么 join 是独立的,而不是 Monad 类型类的最小实现的一部分?

问题描述

我宁愿通过 join 函数定义 Monad 的实例,而不是>>=......从那个等价开始:

x >>= f = join (fmap f x)

你能定义一个只有加入的 Monad 实例吗?

我本来希望通过以下方式加入 Monad:{-# MINIMAL (>>=)| join #-}

为什么join在顶层甚至不在类型类中Monad

标签: haskell

解决方案


遗憾的是,由于与广义新类型派生和角色系统相关的技术限制,join它不是MonadGHC 标准库中类型类的一部分。长话短说,给定一些 newtype newtype T m a = MkT (m a),GHC 还不够聪明,无法弄清楚如何证明 和 之间的表示相等m (m a)m (T m a)这对于证明join( 具有 type m (m a) -> m a) 的第一个参数的表示相等是必要的。

幸运的是,最近对 GHC Haskell 的扩展QuantifiedConstraints,可能使角色系统足够智能以支持这一点。有关该问题及其潜在解决方案的更详细处理,请参阅 Ryan Scott 的博客文章,QuantifiedConstraints 如何让我们将 join 放回 Monad


推荐阅读