Haskell 为什么不是';t'join'是'Monad'类的一部分

Haskell 为什么不是';t'join'是'Monad'类的一部分,haskell,monads,Haskell,Monads,众所周知,(>>=)可以使用fmap和join实现,而join可以使用>=/code>实现。是否有任何理由不定义包含了join且使用以下默认定义的Monad类 join x = x >>= id x >>= f = join $ f <$> x join x=x>>=id x>>=f=加入$f x 这将允许最小定义只包含(>>=)或加入,而不是强制执行(>>=)。考虑到范畴理论倾向于join,这可能有点帮助 反对修改类的通常理由是我们破坏了向后兼容性。但

众所周知,
(>>=)
可以使用
fmap
join
实现,而
join
可以使用
>=/code>实现。是否有任何理由不定义包含了
join
且使用以下默认定义的
Monad

join x  = x >>= id
x >>= f = join $ f <$> x
join x=x>>=id
x>>=f=加入$f x
这将允许最小定义只包含
(>>=)
加入
,而不是强制执行
(>>=)
。考虑到范畴理论倾向于
join
,这可能有点帮助


反对修改类的通常理由是我们破坏了向后兼容性。但是,在这种情况下,这不会发生-我们只添加了使用
join
定义
Monad
的可能性,而这本来是要发生在的(它已经成为GHC 7.10)。然而,在GHC中有一个项目已经无限期地推迟了您建议的实施。

正如您所说,
(>>=)=join。fmap
,但在GHC 7.10之前,Monad
并不是自动的函子。从这个意义上讲,我们在
bind
中定义了
join
fmap
。有时实现
>=
比加入要容易得多。比如说,试着为解析器/状态函子这样做。@AJFarmar我不认为
(>>=)=join。fmap
有效。争论被推翻了,还有一些其他问题。但这是好的观点!啊,你说得对,它实际上是
(join.)。翻转fmap
,但正如你所说,这个想法是存在的。@AJFarmar,最好还是用
=我现在结束这个问题,因为Alexis在那里的答案取代了我在这里的答案。这是排除
加入
的可怕理由。这应该是单子课的一部分。@augustss,这是一个悲哀的原因,不是一个坏的原因。能够对monad使用广义newtype派生和强制是一件好事。@dfeur正如您所说,但您只需单独定义
join
,然后使用标识
(>=)=(join.)。翻转fmap
正如我在上面指出的,所以这不是什么大问题。@dfeur我认为这是一个不好的理由。在国际海事组织看来,GNTD是通过一种不健全的黑客手段实现的。现在,他们已经构建了一个复杂的类型系统来让黑客听起来像是黑客,每个人都必须为此付出代价。@dfeur有两个问题,如何决定接受哪一个GNTD,以及如何进行零成本强制。为了确定新类型派生是否可以接受,我认为编译器应该构造一个实例声明,并确保它进行类型检查。这将排除坏的情况,但也排除一些好的情况。我愿意承担这一损失。要获得零成本强制,您仍然可以像ghc那样使用强制,但我更喜欢编译器识别标识函数并在内部用强制替换它们。我认为当前的GHC情况是抽象的漏洞。