Понимание основных принципов Haskell (монады и так далее), но имеющих не использовали его за 2 года, я боролся в течение двух часов, чтобы сделать это маленькое упражнение чисто:Haskell: список разбит на 3-кортежей
Я хочу, чтобы преобразовать строку 3 * п целых чисел (как в "1 1 1 2 2 2 3 3 3"
) в список 3-кортежей Int
(как в [(1,1,1),(2,2,2),(3,3,3)]
.
Это должно быть сделано в прямой вперед, ошибку выделяющегося пути .
Лучшее решение, которое я мог бы найти до сих пор, содержит следующее:
groupsOf3 :: [a] -> Maybe [(a,a,a)]
groupsOf3 list =
let fun l = case l of
[] -> []
(x:y:z:rest) -> (Just (x,y,z)) : (fun rest)
_ -> [Nothing]
in sequence $ fun list
Это не выглядит элегантным для меня. Как бы я закодировал эту функцию (с тем же интерфейсом) более точную?
Или 'mapM новообращенными. chunksOf 3'. – hammar
Отлично. Спасибо! –