从字符串中获取所有数字并将其显示在列表

时间:2015-10-04 12:30:43

标签: haskell typeerror

我正在做一些Haskell练习,但无法解决最后一个练习。

我需要递归定义已经在Data.Char模块中定义的函数。

我需要定义的最后一个函数是这种类型:

nums :: String -> [Int]

这是(已翻译)的问题:

  

使用Data.Char模块中的函数,递归定义以下函数:

     

(c)nums :: String - > [Int]接收字符串并输出列表   与该字符串上出现的algarisms相同的顺序。

--This is my code

numbers :: String -> [Int]
numbers [] = []
numbers (l:ls) = if ord l >= 48 && ord l <= 57
                 then l : (numbers ls)
                 else (numbers ls)

我在解释器上遇到了这个错误:

pratica3.hs:137:14:
    Couldn't match expected type `Int' with actual type `Char'
    In the first argument of `(:)', namely `l'
    In the expression: l : (numbers ls)
    In the expression:
      if ord l >= 48 && ord l <= 57 then
          l : (numbers ls)
      else
          (numbers ls)
Failed, modules loaded: none.

谢谢。

2 个答案:

答案 0 :(得分:2)

由于这是一个类问题,这里有一些提示。使用函数words首先将字符串分解为单个元素,删除所有非数字字符,然后为字符串的每个元素read "elem":Int,并过滤掉返回false的字符。剩下的将是[Int]

显而易见的神奇之处在于read函数,它接受数字的char表示并将它们转换为Int。如果您的数字非常大,请考虑使用read "elem":Integer变体。

答案 1 :(得分:0)

确定,

解决方案是:

numbers :: String -> [Int]
numbers [] = []
numbers (l:ls) = if ord l >= 48 && ord l <= 57
    then (ord l - 48): (numbers ls)
    else (numbers ls)

这解决了我的问题,现在我会尝试更好地解释它:

  

使用Data.Char模块中的函数,递归地定义   以下功能:

     

(c)nums :: String - &gt; [Int]接收字符串并输出列表   与该字符串上出现的algarisms相同的顺序。

请注意,这是针对那些与haskell语言接触时间少于8小时且使用任何其他语言接触0次的学生。

如果这不正确,我将不胜感激。我想学习。

注意:此解决方案似乎不是最完整的。唉,它是为那些刚刚开始学习Haskell并且不知道如何使用单词和地图功能的学生而设。