【发布时间】:2015-07-22 00:48:00
【问题描述】:
众所周知,(>>=) 可以使用fmap 和join 实现,而join 可以使用>>= 实现。我们是否有任何理由不定义包含join 的Monad 类并使用以下默认定义?
join x = x >>= id
x >>= f = join $ f <$> x
这将允许一个最小定义只包括(>>=) 或join,而不是强制(>>=)。考虑到类别理论倾向于join,这可能会有所帮助。
反对修改类的通常论点是我们破坏了向后兼容性。但是,在这种情况下,这不会发生 - 我们只添加了使用 join 定义 Monad 的可能性。
【问题讨论】:
-
如你所说,
(>>=) = join . fmap,但在 GHC 7.10 之前,Monad不是自动成为仿函数。从这个意义上说,我们在bind中定义了join和fmap。有时实现>>=也比加入要容易得多。尝试为解析器/状态函子做这件事。 -
@AJFarmar 我不认为
(>>=) = join . fmap有效。争论被颠倒了,还有一些其他的问题。但好点! -
啊,你是对的,它实际上是
(join .) . flip fmap,但正如你所说,这个想法就在那里。 -
@AJFarmar,最好选择
=<<,它更符合世界其他地区。f =<< m = join (fmap f m)或(=<<) f = join . fmap f. -