我正在阅读 Hutton 的书《Haskell 编程》。这是一个函数:
pairs :: [a] -> [(a,a)]
pairs xs = zip xs (tail xs)
例如
>对 [1,2,3,4]
>[(1,2),(2,3),(3,4)] --结果
问题是如何读取这个函数?从左到右?
我很困惑“tail”如何留下 1 个元素,然后使用“zip”将其与下一个元素结合起来,因为“tail”假设从列表中获取所有剩余元素对吗?
我正在阅读 Hutton 的书《Haskell 编程》。这是一个函数:
pairs :: [a] -> [(a,a)]
pairs xs = zip xs (tail xs)
例如
>对 [1,2,3,4]
>[(1,2),(2,3),(3,4)] --结果
问题是如何读取这个函数?从左到右?
我很困惑“tail”如何留下 1 个元素,然后使用“zip”将其与下一个元素结合起来,因为“tail”假设从列表中获取所有剩余元素对吗?
我没有读过你提到的那本书,但我会尽力解释我所知道的。
您对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)]
从上面的应用中,我们可以看到调用withzip
可以得到我们需要的输出,zip
zip [1, 2, 3] [2, 3, 4]
现在,从有关function的文档中zip
,我们可以看到,如果两个给定列表的长度不等,则较长列表中的额外项目将被丢弃。所以,我们会得到相同的结果,
zip [1, 2, 3, 4] [2, 3, 4]
其中第一个输入列表中的最后4
一个将被丢弃,我们得到我们想要的结果。
这可以写成一个函数,
pairs xs = zip xs (tail xs)
如果您对其他事情感到困惑,请告诉我。
zip
需要 2 个参数。tail
返回其参数并删除第一个元素,但不修改其参数[1, 2, 3, 4]
。因此zip
使用[2, 3, 4]
.