Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell-函数定义所需的Num Char实例_Haskell - Fatal编程技术网

Haskell-函数定义所需的Num Char实例

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实例”?的优先级高于+,

我想用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实例”?

的优先级高于
+
,因此
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