Haskell-函数定义所需的Num Char实例
我想用3个输入参数和1个输出参数编写一个简单的递归函数:Haskell-函数定义所需的Num Char实例,haskell,Haskell,我想用3个输入参数和1个输出参数编写一个简单的递归函数: getLengthOfNumber :: (String, Int, Int) -> Int getLengthOfNumber (n, i, res) | isCharDigit(n!!i+1) = getLengthOfNumber (n, i+1, res+1) | otherwise = res 为什么Hugs向我抛出错误“getLengthOfNumber定义所需的Num Char实例”?的优先级高于+,
getLengthOfNumber :: (String, Int, Int) -> Int
getLengthOfNumber (n, i, res)
| isCharDigit(n!!i+1) = getLengthOfNumber (n, i+1, res+1)
| otherwise = res
为什么Hugs向我抛出错误“getLengthOfNumber定义所需的Num Char实例”?
代码>的优先级高于+
,因此n!!i+1
被解析为(n!!i)+1
,它试图将一个元素添加到字符串的元素中,只有当Char
是一个数字时,它才起作用。您应该改为编写n!!(i+1)
,因为它解释:
n!!i+1
作为:
因此,它首先获取字符串的i
-第个字符,然后将1
添加到字符串中。现在,在Haskell中可以定义自定义数字类型。因此,这里可以将该字符和1
相加,但前提是该字符是一个数字
但尽管如此,即使固定支架,上述方法也不起作用。您没有指示何时停止迭代:对于字符串“123”
,它最终将获得最后一个字符,然后在到达字符串末尾时引发“索引太大”错误。而且
效率不高:它需要O(k)来访问第k个元素,这使得该算法成为二次算法
这里可以使用和:首先取字符的最长前缀,然后取该列表的长度,如:
getLengthOfNumber :: String -> Int
getLengthOfNumber = length . takeWhile isCharDigit
谢谢N(i+1)修复了我的问题。除此之外,该函数的工作原理与我所需要的一样。@GeorgNatter:如果您输入“123”
,会怎么样?
getLengthOfNumber :: String -> Int
getLengthOfNumber = length . takeWhile isCharDigit