【发布时间】:2012-10-02 06:00:04
【问题描述】:
我有以下代码:
betaRest :: Int -> [Int] -> Int
betaRest n prevDigits | n == 0 = (length prevDigits)
| otherwise = (sum (map (betaRest (n - 1)) [0..9]))
betaFirst :: Int -> Int
betaFirst n | n == 0 = 0
| otherwise = (betaRest (n - 1) [1..9])
它给了我以下错误,我不知道为什么。
1) (Enum [Int]) 没有来自算术序列'0 .. 9'的实例
2) (Num [Int]) 没有由文字 '0' 产生的实例
Haskell 是否认为使用“..”运算符所做的事情是枚举?但是为什么下面4行(带有“[1..9]”)的行没有错误呢?
编辑:我想要代码做的是这样的(程序上):
int betaRest(int n, int[] prevDigits) {
if (n == 0) return prevDigits.length;
else {
sum = 0;
foreach prevDigit in prevDigits {
sum += betaRest(n - 1, [0..9]);
}
return sum;
}
}
int betaFirst(int n) {
if (n == 0) return 0;
else return betaRest(n - 1, [1..9]);
}
因此,betaFirst(1) == 9 和 betaFirst(2) == 90。是的,有人可能想建议一个生成此公式的公式,但我将添加某种过滤器到 [0 ..9],从而缩小范围。
【问题讨论】:
-
并非所有错误都在一次运行中出现 - 某些错误可能不会显示,因为编译器因其他错误而停止。是的,
..是一个枚举,只是你不这么认为。另外,为什么betaFirst只接受一个参数然后应用于两个?它应该做什么? -
@thomas-m-dubuisson 啊,原来是枚举。我想那时可以使用范围函数。仔细看,
betaFirst没有调用自己,它调用了betaRest。 -
尝试将
[0..9]更改为[(0 :: Int)..9]。它应该会给你一个更好的错误信息。 -
问题可能出在
betaRests 否则分支。有一些放错位置的括号和另一个与列表嵌套有关的问题。 -
@JohnL 哪些括号放错了?在我看来,它们都很好;我把它们放在
betaRest (n - 1)周围,这样我就可以将 map 与带有多个参数的函数一起使用。