如何将数字列表拆分为具有Haskell中所有数字的一组列表

时间:2018-10-24 08:54:47

标签: string list haskell recursion

我如何仅通过递归和函数对前奏的拆分,将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.

3 个答案:

答案 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
  1. 过滤字符串中不是数字的每个元素(Data.Char.isNumber也可以这样做,但前提是仅使用Prelude函数)并在过滤后的列表上调用listSplit'

  2. (ws ++ [x : takeWhile (==x) xs])收集xs中的所有内容,直到到达不等于x的字母,将其包装在列表中并将其附加到ws。 / p>

  3. (dropWhile (==x) xs)删除xs中的每个字母,直到到达不等于x的字母。

  4. 最后,该函数使用更新后的ws和简化后的xs

  5. 调用自身
  6. 如果没有其他剩余元素,则该函数返回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