我目前正在Haskell学习Applicatives。如果我没有错,列表有两个不同的Applicative实例,(var tasksRead = Enumerable.Range(3, 35).Select(i => ReadSensorsAsync(i)).ToList();
和List
- 第二个被定义为包装List值的newtype。 ZipList
适用的实例对我来说似乎更直观。
这可能是一个愚蠢的问题,但是有一个特定的原因ZipList
不是列表的默认应用实例。
ZipList
是因为Applicative List的分发版本也恰好有Monad实例吗?
答案 0 :(得分:13)
我怀疑这里的诚实回答是“历史意外”。 monad抽象在应用之前很受欢迎;由于有一个自然列表monad,该实例已定义。为了向后兼容,保持仿函数和应用程序实例保持一致是有意义的。
那就是说,如果我们今天必须再次做出选择,我认为无论如何我都会支持当前的情况:非确定性monad是有用的作为语法上便宜的回溯搜索,我已经采取了经常的优势;任意性拉链(根据我的个人经验)是一种不那么频繁的需求。