我如何仅通过递归和函数对前奏的拆分,将Haskell中的列表(例如“ 222 33244”)拆分为[“ 222”,“ 33”,“ 2”,“ 444”]?
我当前的尝试是:
ACI0098213 'HTTP Get' command fails on Windows system and returns unexpectedly the error #30 ("HTTP Server unreachable") for some web sites.
答案 0 :(得分:1)
因此,由于我不太了解您的方法,并且ghci在您的代码中列出了18个编译错误,因此恐怕无法为您提供解决方案的帮助。
正如评论中指出的那样,可能的解决方案是:
listSplit xs = listSplit' [] (filter (`elem` ['0'..'9']) xs)
listSplit' ws (x:xs) = listSplit' (ws ++ [x : takeWhile (==x) xs]) (dropWhile (==x) xs)
listSplit' ws [] = ws
过滤字符串中不是数字的每个元素(Data.Char.isNumber也可以这样做,但前提是仅使用Prelude函数)并在过滤后的列表上调用listSplit'
(ws ++ [x : takeWhile (==x) xs])
收集xs
中的所有内容,直到到达不等于x
的字母,将其包装在列表中并将其附加到ws
。 / p>
(dropWhile (==x) xs)
删除xs
中的每个字母,直到到达不等于x
的字母。
最后,该函数使用更新后的ws
和简化后的xs
如果没有其他剩余元素,则该函数返回ws
答案 1 :(得分:0)
如果您的目标是使用很少的预定义函数,则可能会给您一些想法:
listSplit :: String -> [String]
listSplit xs =
let (as, a) = foldr go ([], []) numbers
in a : as
where
isNumber x = x `elem` ['0'..'9']
numbers = filter isNumber xs
go cur (res, []) = (res, [cur])
go cur (res, lst@(a:_))
| a == cur = (res, a : lst)
| otherwise = (lst : res, [cur])
当然,您也可以用自己的递归替换foldr
:
numberSplit :: String -> [String]
numberSplit xs =
let numbers = filter (`elem` ['0'..'9']) xs
in listSplit numbers
listSplit :: Eq a => [a] -> [[a]]
listSplit =
reverse . go [] []
where
go acc as [] = as : acc
go acc [] (x:xs) = go acc [x] xs
go acc as@(a:_) (x:xs)
| a == x = go acc (a : as) xs
| otherwise = go (as : acc) [x] xs
答案 2 :(得分:0)
我有一点时间来实现它,但是我认为这就是您想要的。
nav controller -> tab bar controller -> nav controller