当前位置:  开发笔记 > 小程序 > 正文

从String获取小数

如何解决《从String获取小数》经验,为你挑选了1个好方法。

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

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

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

但是因为我无法找到解决方案而无法填写当时的问题,你能给我一些提示吗?



1> leftaroundab..:

你试着以类似命令的方式解决这个问题:"看看列表的这一部分,它是我们想要的吗?那么那就做那件事......哦,不,不是吗?那么继续......"

知道如何以这样的方式实现它确实不会有害,但无论如何更好地立即学习更简洁,解释性,声明性的方法."哈斯克尔的方式".

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

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

                groupBy ((==) `on` isDigit)

意思是,我们想要将具有"相同数字存在状态"的元素分组.

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

                filter (isDigit . head)

(我刚刚检查过第一个字符是否为数字;以下内容肯定也是如此,因为这就是我们分组的内容.

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

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

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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有