我正在做一些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.
谢谢。
答案 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并且不知道如何使用单词和地图功能的学生而设。