【发布时间】:2023-04-05 09:15:01
【问题描述】:
似乎有很多函数做同样的事情,尤其是与 Monads、Functors 和 Applicatives 相关的函数。
示例(从最通用到最不通用):
fmap == liftA == liftM
(<*>) == ap
liftA[2345] == liftM[2345]
pure == return
(*>) == (>>)
不直接基于 FAM 类树的示例:
fmap == map
(我认为 List、Foldable、Traversable 有更多,但看起来大多数前一段时间都变得更加通用,因为我只在旧堆栈溢出/留言板中看到旧的、不太通用的类型签名问题)
我个人觉得这很烦人,因为这意味着如果我需要执行 x,并且某些函数(例如 liftM)允许我执行 x,那么我将使我的函数变得不那么通用,我会只有通过彻底推理类型之间的差异(例如 FAM,或者可能还有 List、Foldable、Traversable 组合)才能注意到这种事情,这根本不适合初学者,因为简单地使用这些类型不是这么难,推理它们的性质和规律需要更多的脑力劳动。
我猜很多这些等价物来自 Applicative Monad 提案。如果这就是它们的原因(而不是我因为缺少可用于混淆的通用功能较少而遗漏的其他原因),它们是否会被弃用/删除?由于破坏了现有代码,我可以理解等待很长时间才能删除它们,但肯定弃用是个好主意吗?
【问题讨论】:
-
始终使用
fmap、pure和(*>) -
@ZhekaKozlov 当然可以,但是其他人编写的代码我可能必须与之交互,而且我可能不知道的情况不仅仅是
fmappure和*>全部。
标签: haskell