为什么 ZipList 不是 List 的默认应用实例

Why ZipList is not the default Applicative Instance for List

我目前正在 Haskell 学习 Applicatives。如果我没记错的话,Lists 有两个不同的 Applicative 实例(ListZipList - 第二个被定义为包装 List 值的新类型)。 ZipList 应用实例对我来说似乎更直观。

这可能是个愚蠢的问题,但有没有特定原因 ZipList 不是列表的默认应用程序实例。

pure (+) <*> [1,2,3] <*> [4,5,6]
-- [5,6,7,6,7,8,7,8,9]

pure (+) <*> ZipList [1,2,3] <*> ZipList [4,5,6]
-- ZipList [5,7,9]

是不是因为分布式版本的Applicative List也恰好有一个Monad实例?

我怀疑这里的诚实答案是 "historical accident"。 monad 抽象在应用性抽象之前流行;因为有一个自然列表 monad,所以定义了那个实例。为了向后兼容,保持仿函数和应用实例向前一致是有意义的。

就是说,如果我们今天必须再次做出选择,我想我无论如何都会支持目前的情况:非确定性 monad 有用 作为一种语法便宜的回溯搜索,我经常利用这一点;任意数量压缩(以我个人的经验)是一种不太常见的需求。