你如何在Haskell中编写函数'pair'?

unj*_*nj2 19 haskell tuples list

对函数需要做这样的事情:

pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
Run Code Online (Sandbox Code Playgroud)

Die*_*Epp 42

pairs [] = []
pairs xs = zip xs (tail xs)
Run Code Online (Sandbox Code Playgroud)

  • 你应该对第二行没问题,因为`zip [] undefined`是`[]` (21认同)

Edw*_*ETT 20

你可以走得那么远

import Control.Applicative (<*>)
pairs = zip <*> tail
Run Code Online (Sandbox Code Playgroud)

pairs xs = zip xs (tail xs)
Run Code Online (Sandbox Code Playgroud)

可能更清楚.


Chu*_*uck 6

仅仅为了完整性,使用显式递归的更"低级"版本:

pairs (x:xs@(y:_)) = (x, y) : pairs xs
pairs _          = []
Run Code Online (Sandbox Code Playgroud)

该构造x:xs@(y:_)意味着"具有头部的列表x,以及xs具有至少一个元素的尾部y".这是因为y当前对的第二个元素和下一个元素的第一个元素都是双倍的.否则,我们必须为长度为1的列表创建一个特例.

pairs [_] = []
pairs []  = []
pairs (x:xs) = (x, head xs) : pairs xs
Run Code Online (Sandbox Code Playgroud)

  • `pair(x:y:rest)=(x,y):pair(y:rest)`也可以工作,避免使用`@`,但需要额外的构造函数. (4认同)