我正在阅读Hutton的书“Haskell编程”。 这是一个功能:
pairs :: [a] -> [(a,a)]
pairs xs = zip xs (tail xs)
e.g。
>对[1,2,3,4]
> [(1,2),(2,3),(3,4)] - 结果
问题是如何阅读此功能?从左到右?
我很困惑“tail”如何留下1个元素然后使用“zip”将它与下一个元素组合 既然“tail”假设从列表中获取所有剩余的元素呢?
答案 0 :(得分:10)
我没有看过你提到的那本书,但我会试着解释一下我所知道的。
关于tail
函数返回除列表的第一个元素之外的所有内容,你是对的。让我们看看zip
的工作原理,
zip [1, 2, 3, 4] [5, 6, 7, 8]
给出,
[(1, 5), (2, 6), (3, 7), (4, 8)]
现在,考虑我们输入所需的输出,观察从输入到输出所需的转换,
[1, 2, 3, 4] -> [(1,2),(2,3),(3,4)]
从zip
的上述应用中,我们可以看到我们需要的输出可以通过调用zip
来获得,
zip [1, 2, 3] [2, 3, 4]
现在,从docs on zip
function,我们可以看到,如果两个给定列表的长度不相等,则会丢弃较长列表中的额外项目。所以,我们会得到相同的结果,
zip [1, 2, 3, 4] [2, 3, 4]
其中第一个输入列表中的最后一个4
将被丢弃,我们得到我们想要的结果。
这可以写成函数,
pairs xs = zip xs (tail xs)
如果您对此感到困惑,请告诉我。
答案 1 :(得分:6)
zip
有2个参数。 tail
返回其参数,删除第一个元素,但不修改其参数。因此[1, 2, 3, 4]
获得zip
ped [2, 3, 4]
。