Функция пар должна сделать что-то вроде этого:
pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
Вы могли бы пойти так далеко, как
import Control.Applicative (<*>)
pairs = zip <*> tail
, но
pairs xs = zip xs (tail xs)
, вероятно, более понятен.
Для полноты картины предлагается более «низкоуровневая» версия с явной рекурсией:
pairs (x:xs@(y:_)) = (x, y) : pairs xs
pairs _ = []
Конструкция x: xs @ (y: _)
означает «список с заголовком x
и хвост xs
, который имеет хотя бы один элемент y
". Это потому, что y
удваивается как второй элемент текущей пары и как первый элемент следующей. В противном случае нам пришлось бы создать особый случай для списков длины 1.
pairs [_] = []
pairs [] = []
pairs (x:xs) = (x, head xs) : pairs xs