【问题标题】:Retrieve decimal numbers from String and put them in an [Int] list recursively从 String 中检索十进制数并将它们递归地放入 [Int] 列表中
【发布时间】:2015-05-21 07:56:07
【问题描述】:

我正在阅读 learnyouahaskell 章节,并一直在尝试递归函数(和守卫)。我找到了一些练习,其中一个我要从 [Int] 形式的字符串中检索十进制数。这是我目前所拥有的:

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString (x:xs)
    | x `elem` ['0'..'9'] = x:retrieveDecimalsFromString xs
    | otherwise = retrieveDecimalsFromString xs

我理解这会崩溃,因为我返回的是字符串而不是 [Int]。不过,我似乎无法找到解决方案。也许我的方法是错误的。或者(没有递归)我试过:

retrieveDecimalsFromString :: String -> [Int]
retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs

这会导致同样的问题。以上可以吗?

【问题讨论】:

    标签: string list haskell recursion type-conversion


    【解决方案1】:
    1. 当你使用递归时,你应该有一个基本条件。在您的代码中,当字符串为空时,它会做什么?那是你的基本条件。所以,像这样改变函数定义

      retrieveDecimalsFromString :: String -> [Int]
      retrieveDecimalsFromString "" = []
      

      基本条件是,如果输入是空字符串,我将返回一个空列表。

    2. 现在,当x 是其中一个数字时,x:retrieveDecimalsFromString xs 会做什么?它将尝试创建一个列表。但是第一个元素xChar,根据retrieveDecimalsFromString的定义,返回值是[Int]。所以,你需要将Char 转换为Int,像这样

      retrieveDecimalsFromString (x:xs)
          | x `elem` ['0'..'9'] = (digitToInt x):retrieveDecimalsFromString xs
          | otherwise = retrieveDecimalsFromString xs
      

    filter 版本中,您说retrieveDecimalsFromString 将根据签名返回[Int],但过滤的结果将是[Char]。这就是为什么它不起作用。您可以通过更改任何一个地方的类型来解决这个问题

    retrieveDecimalsFromString :: String -> [Char]
    retrieveDecimalsFromString xs = filter (`elem` ['0'..'9']) xs
    

    或者

    retrieveDecimalsFromString :: String -> [Int]
    retrieveDecimalsFromString xs = map digitToInt $ filter (`elem` ['0'..'9']) xs
    

    注意: digitToInt 函数在 Data.Char 中。所以使用前需要先导入。

    【讨论】:

    • 我最初在基本条件下苦苦挣扎,为了我的问题,我删除了我的(不正确的)行。也感谢您解决这个问题。您的深入解释证实了我自己的思考过程。我确实遇到过 digitToInt,但我不知道在 Haskell 中使用了导入。非常感谢,它就像一个魅力!
    • retrieveDecimalsFromString = map digitToInt . filter isDigit 看起来更漂亮一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多