haskell - 为什么 join 是独立的,而不是 Monad 类型类的最小实现的一部分?
问题描述
我宁愿通过 join 函数定义 Monad 的实例,而不是>>=
......从那个等价开始:
x >>= f = join (fmap f x)
你能定义一个只有加入的 Monad 实例吗?
我本来希望通过以下方式加入 Monad:{-# MINIMAL (>>=)| join #-}
为什么join
在顶层甚至不在类型类中Monad
?
解决方案
遗憾的是,由于与广义新类型派生和角色系统相关的技术限制,join
它不是Monad
GHC 标准库中类型类的一部分。长话短说,给定一些 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。
推荐阅读
- html - 如何在Django2.0中使用html或css添加背景
- android - 尝试在外部活动(片段)中返回 PlacePicker 信息时未调用 onActivityResult
- javascript - 从 HH:MM 格式计算总时间
- javascript - Angular Forms - 初始化的正确方法是什么
- javascript - 无缝交换视频
- angular - Angular 的 httpclient 使用参数获取 ASP.Net Core 控制器
- dart - 在同一台机器上更改 Flutter/Dart 的上传器
- php - 注册和登录php代码
- python - Python - 将数据从 csv 写入新 csv 但行被覆盖
- java - Can't connect MySQL / Eclipse / iText last error: java.sql.SQLNonTransientConnectionException