为什么'join`不是`Monad`类的一部分

Ale*_*lec 16 monads haskell

众所周知的事实(>>=)可以使用而实现fmap,join并且join可以使用实现>>=.是否有任何理由我们没有Monad使用join包含和使用以下默认定义来定义类?

join x  = x >>= id
x >>= f = join $ f <$> x
Run Code Online (Sandbox Code Playgroud)

这将允许最小定义包括just (>>=)join,而不是强制(>>=).考虑到类别理论倾向于支持,可能会有点帮助join.

反对修改类的常见理由是我们打破了向后兼容性.但是,在这种情况下,这不会发生 - 我们只增加了定义Monad使用的可能性join.

dup*_*ode 21

这应该与Applicative-Monad提案(已经进入GHC 7.10)一起发生.但是,GHC中存在一个涉及类型角色的技术问题,它无限期地推迟了您的建议.

  • 这是排除"加入"的可怕理由.它应该是Monad类的一部分. (6认同)
  • @augustss,这是一个*悲伤的原因,而不是一个*糟糕的*.能够对monad使用广义newtype派生和强制是一件好事. (4认同)
  • @dfeuer我认为这是一个不好的理由.国际土地利用组织(IMO)是一个不健全的黑客实施的.而现在他们已经构建了一个精心设计的类型系统来使黑客发出声音,每个人都必须付钱. (2认同)
  • @dfeuer有两个问题,如何决定接受哪个GNTD以及如何进行零成本强制.要确定newtype派生是否可接受,我认为编译器应该构造一个实例声明并确保它进行类型检查.这将排除坏情况,但也有一些好的案例.我愿意承担这一损失.为了获得零成本强制,您仍然可以像ghc那样使用强制,但我更希望编译器识别身份函数并在内部通过强制替换它们.我认为当前的ghc情况是抽象泄漏. (2认同)