拆分内容列表

时间:2018-10-10 12:42:13

标签: list haskell

我想创建一个函数,将这个列表变成一个新的列表列表,每当它说“ gap”时将其拆分

["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 :(得分:2)

span函数完成了工作。

format :: [String] -> [[String]]
format ("gap":ws) = format ws
format [] = []
format ws = let (w1, w2) = span (/= "gap") ws
            in w1:format w2

答案 1 :(得分:1)

您也可以使用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",则让我们在累积列表[]的开头插入一个新的空列表a,否则取{{ 1}}到我们的累积列表head中,将当前元素a插入到我们列表的l中,然后将其插入到我们累积列表head的{​​{1}}中}。

如果存在大量tail,上述方法可能会引入一些空白子列表。因此,如果这是可能的话,那么可以采取另一种方法。

a