Ответ 1
pairs [] = []
pairs xs = zip xs (tail xs)
Функция пар должна сделать что-то вроде этого:
pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
pairs [] = []
pairs xs = zip xs (tail xs)
Вы можете зайти так далеко, как
import Control.Applicative (<*>)
pairs = zip <*> tail
но
pairs xs = zip xs (tail xs)
вероятно, более ясный.
Только для полноты более "низкоуровневая" версия с явной рекурсией:
pairs (x:[email protected](y:_)) = (x, y) : pairs xs
pairs _ = []
Конструкция x:[email protected](y:_)
означает "список с головой x
и хвостом xs
, который имеет хотя бы один элемент y
". Это связано с тем, что y
удваивается как второй элемент текущей пары, так и первый элемент следующего. В противном случае нам пришлось бы сделать специальный случай для списков длины 1.
pairs [_] = []
pairs [] = []
pairs (x:xs) = (x, head xs) : pairs xs
Позвоните богу ацтеков последовательных чисел:
import Control.Monad (ap)
import Control.Monad.Instances() -- for Monad ((->) a)
foo = zip`ap`tail $ [1,2,3,4]