Я пишу функцию, которая уменьшает свободные слова. Его можно рассматривать как следующий алгоритм:
Идея состоит в том, чтобы отменить элементы в списке, если они являются отрицательными друг от друга и примыкают друг к другу. Повторно нанесите его, пока его больше не будет отменено. Например [-2,1, -1,2,3] → [-2,2,3] → [3]
Я написал следующий код. Это не кажется элегантным. Он использует голову, хвост много раз, и для этого входа есть 3 шаблона, неплохо, если его можно уменьшить до 2. Я хочу знать, есть ли более элегантные способы написать его в Haskell. Я подозреваю, что могу использовать сгиб для этого, но я не понимаю, как это сделать естественным образом.
freeReduce [] = []
freeReduce [x] = [x]
freeReduce (x:xs)
| x == -(head xs) = freeReduce (tail xs)
| otherwise = if' (rest == [])
[x]
(if' (x == - (head rest)) (tail rest) (x:rest))
where rest = freeReduce xs