这个函数中的xs如何工作?

时间:2013-05-25 04:24:47

标签: haskell

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

2 个答案:

答案 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]