Так много возможностей.Как насчет этого?
unpair' = concatMap (\(x,y) -> [x,y])
pair' xs = map snd . filter fst . zip (cycle [True, False]) $ zip xs (tail xs)
pair'' xs = [(x,y) | (True,x,y) <- zip3 (cycle [True,False]) xs (tail xs)]
Две версии пары должны быть одинаковыми.
Редактировать: Что касается моего комментария выше, можно использовать пакет split из Hackage, чтобы написать:
pair xs = map head . splitEvery 2 $ zip xs (tail xs)
, что ближе к желаемому
pair xs = everyOther $ zip xs (tail xs)
Но, в духе бессмысленности, я думаю, что мы, вероятно, все должны согласиться на его написание,
pair = map head . splitEvery 2 . (zip <$> id <*> tail)
дляобеспечить путаницу.