Как Вы пишете функциональных 'пар' в Haskell?

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

pairs [1, 2, 3, 4] -> [(1, 2), (2, 3), (3, 4)]
19
задан Don Stewart 18 April 2011 в 23:33
поделиться

3 ответа

pairs [] = []
pairs xs = zip xs (tail xs)
42
ответ дан 30 November 2019 в 02:02
поделиться

Вы могли бы пойти так далеко, как

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

, но

pairs xs = zip xs (tail xs)

, вероятно, более понятен.

20
ответ дан 30 November 2019 в 02:02
поделиться

Для полноты картины предлагается более «низкоуровневая» версия с явной рекурсией:

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
6
ответ дан 30 November 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: