Вы также можете использовать foldr
для этой работы
let fun = foldr (\l a -> case l of
"gap" -> [] : a
_ -> (l : (head a)) : (tail a)) []
Prelude> fun ["dash", "dot", "dot", "gap", "dash", "dash", "dash", "gap", "dash", "dash", "dot", "gap"]
[["dash","dot","dot"],["dash","dash","dash"],["dash","dash","dot"]]
Если текущий элемент l
является "gap"
, тогда давайте вставим новый пустой список []
в начало нашего накопленияlist a
или еще давайте возьмем head
нашего накопительного списка a
, вставим текущий элемент l
в head
нашего списка и вставим его в tail
нашего накопительного списка a
.
Приведенный выше метод может ввести некоторые пустые подсписки, если есть последовательные "gap"
с.Так что, если это возможно, то другой подход может быть.
let ff = filter (not . elem "gap") . groupBy (\x y -> x /= "gap" && y /= "gap")
Prelude> ff ["dash", "dot", "dot", "gap", "gap", "dash", "dash", "dash", "gap", "dash", "dash", "dot", "gap"]
[["dash","dot","dot"],["dash","dash","dash"],["dash","dash","dot"]]