Подтвердить что ты не робот

Как вы пишете функции "пары" в Haskell?

Функция пар должна сделать что-то вроде этого:

pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
4b9b3361

Ответ 1

pairs [] = []
pairs xs = zip xs (tail xs)

Ответ 2

Вы можете зайти так далеко, как

import Control.Applicative (<*>)
pairs = zip <*> tail

но

pairs xs = zip xs (tail xs)

вероятно, более ясный.

Ответ 3

Только для полноты более "низкоуровневая" версия с явной рекурсией:

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

Ответ 4

Позвоните богу ацтеков последовательных чисел:

import Control.Monad (ap)
import Control.Monad.Instances() -- for Monad ((->) a)

foo = zip`ap`tail $ [1,2,3,4]