Допустим, у меня есть следующее:
data D = A Int | B Int deriving Show
и у меня есть функция
simplify :: [D] -> [D]
Моя цель - упростить создание нового списка, в котором он будет складывать все значения с данными A
(в одно значение данных A
) и сохранять данные B
как есть.
Например, [A 1, A 2, A 3, B 1, A 4, B 2]
станет [A 10, B 1, B 2]
.
Я знаю, что могу сделать это с помощью foldl:
A (foldl (+) 0 [x | A x <- ll]) : [B x | B x <- ll]
Но для этого нужно дважды просмотреть список в поисках конструкторов.
Мне было интересно, если есть способ использовать раздел, где я мог бы разделить список на те, которые имеют данные A
и те, которые не имеют.