Разделение списка в зависимости от содержимого - PullRequest
0 голосов
/ 10 октября 2018

Я хотел бы создать функцию, которая превращает этот список в новый список списков, разбивая этот список каждый раз, когда он говорит, что «пробел»

["dash", "dot", "dot", "gap", "dash", "dash", "dash", "gap", "dash", "dash", "dot", "gap"]

станет

[["dash", "dot", "dot"], ["dash", "dash", "dash"], ["dash", "dash", "dot"]]

любая идея оценена, как, скажем, я потратил много времени на это без везения ...

format :: [String] -> [[String]]
format []
    = []
format (x:xs)
    | x == "gap" = []
    | otherwise = x : (format xs)

main :: IO()
main = 
    putStrLn ( show ( format ["dash", "dot", "dot", "gap", "dash", "dash", "dash", "gap", "dash", "dash", "dot", "gap"] ) )

Это то, над чем я работаю, но я сталкиваюсь с ошибками типов идаже если я их отсортирую, я считаю, что он будет работать только до первого «пробела» ...

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы также можете использовать 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"]]
0 голосов
/ 10 октября 2018

span функция делает работу.

format :: [String] -> [[String]]
format ("gap":ws) = format ws
format [] = []
format ws = let (w1, w2) = span (/= "gap") ws
            in w1:format w2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...