在ZipList中实现`pure`

时间:2014-12-01 02:41:01

标签: haskell

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

为什么以这种方式实现 - 生成一个没有结束的列表?

1 个答案:

答案 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],则右侧只有一个项目。