我想创建一个函数,将这个列表变成一个新的列表列表,每当它说“ 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"] ) )
这是我一直在努力的工作,但是我陷入了类型错误,即使我对它们进行排序,我也认为它将一直运行到第一个“间隙” ...
答案 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