2

我正在阅读 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”假设从列表中获取所有剩余元素对吗?

4

2 回答 2

11

我没有读过你提到的那本书,但我会尽力解释我所知道的。

您对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)

如果您对其他事情感到困惑,请告诉我。

于 2013-05-25T04:39:40.400 回答
6

zip需要 2 个参数。tail返回其参数并删除第一个元素,但不修改其参数[1, 2, 3, 4]。因此zip使用[2, 3, 4].

于 2013-05-25T04:36:11.957 回答