从String获取小数

时间:2014-03-18 23:03:39

标签: list haskell int decimal

我有一个函数,它接受一个字符串并搜索小数并输出它们。 到目前为止我得到的是:

getDecimal :: String -> [Int]
getDecimal[] = 0
getDecimal (x:y:xs) = 
    if
        isDecimal x y
    then 
        //output list
    else
        getDecimal xs

(例如:getDecimal" he12llo035"将输出12,035

但是当时因为我无法找到解决方案而无法填写,你们可以给我一些提示吗?

1 个答案:

答案 0 :(得分:8)

您尝试以类似命令的方式解决此问题:"查看列表中的部分,这是我们想要的吗?那么那就做那件事......哦,不,不是吗?然后继续那里......"

知道如何以这样的方式实现它确实不会受到伤害,但无论如何更好地学习更简洁,解释性的,声明性的方法。 " Haskell方式"。

这通常意味着:在子任务中分割你的目标。您首先要将所有数字分组到一个元素,而不是列表中的一组字符。好吧,你可以hoogle for "group"

确实有一组比较,但它只是将相等的元素放在一起。这有点太强了,我们肯定希望在每个数字中允许不同的数字! groupBy是允许此版本的版本。那么,根据我们想要分组的内容?那么,取决于它是否是一个数字。 Data.Function模块中有一个很好的帮手,可以让你很好地阐述这一点:

                groupBy ((==) `on` isDigit)

意思是,我们希望将具有"相同状态的数字存在的元素分组为#34;。

之后,您将拥有一个字符串列表,并且知道每个字符串都是完整的数字或不相关的内容。后者将被扔掉......

                filter (isDigit . head)

(我刚刚检查过第一个字符是否为数字;以下内容肯定也是如此,因为我们已将这些字符分组。<\ n / p>

现在你还有一个仍然是字符串形式的数字列表,剩下要做的就是解析(读取!)每个数字。

import Data.Char
import Data.List
import Data.Function

getDecimalNums :: String -> [Int]
getDecimalNums = map read . filter (isDigit . head) . groupBy ((==) `on` isDigit)