我有一个函数,它接受一个字符串并搜索它为小数并输出它们.到目前为止我得到的是:
getDecimal :: String -> [Int] getDecimal[] = 0 getDecimal (x:y:xs) = if isDecimal x y then //output list else getDecimal xs
(例如:getDecimal"he12llo035"将输出12,035
但是因为我无法找到解决方案而无法填写当时的问题,你能给我一些提示吗?
你试着以类似命令的方式解决这个问题:"看看列表的这一部分,它是我们想要的吗?那么那就做那件事......哦,不,不是吗?那么继续......"
知道如何以这样的方式实现它确实不会有害,但无论如何更好地立即学习更简洁,解释性,声明性的方法."哈斯克尔的方式".
这通常意味着:在子任务中分割你的目标.您首先要将所有数字分组到一个元素,而不是列表中的一组字符.好吧,你可以为"群组"搞笑!
确实存在群体比较,但它只是将相同的元素放在一起.这有点太强了,我们肯定希望在每个数字中允许不同的数字!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)