Typeclassopedia出现了这个问题:
为Applicative的ZipList实例确定pure的正确定义 - 只有一个 满足与pure和(< *>)相关的法律的实现。
我不确定如何直接解决,所以我在ghci
测试了它:
ghci> pure 5 :: ZipList Int
ZipList {getZipList = [5,5,5,5,5,5,5,5,5,5,5,5,5, ...
其中...
表示无穷无尽的5
为什么以这种方式实现 - 生成一个没有结束的列表?
答案 0 :(得分:14)
采用Applicative Functors的身份法
pure id <*> v = v -- Identity
在ZipList的上下文中,我们通过将<*>
左侧的每个函数应用于右侧的相应值来生成输出....
ZipList [f1, f2, f3, ....] <*> ZipList [v1, v2, v3, ....] =
ZipList [f1 v1, f2 v2, f3 v3, ....]
因此,要让v
返回,我们需要左侧的每个函数都为id
。
pure id = [id, id, id, ....]
如果左侧是单个函数[id]
,则右侧只有一个项目。