我有以下代码:
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) 算术序列“0 .. 9”没有产生 (Enum [Int]) 的实例
2) 没有由文字“0”产生 (Num [Int]) 的实例
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 添加某种过滤器],从而缩小范围。
你过关了betaRest
to map
。地图是(a -> a) -> [a] -> [a]
so for [Int]
列出你通过它它想要一个Int -> Int
功能。但部分应用betaRest
is [Int] -> Int
.
As for [0..9]
它的类型是(Enum t, Num t) => [t]
它被翻译成enumFromTo 0 9
应用。所以编译器以相反的方式计算出你的错误:如果你定义了特殊的Num
and Enum
列表的实例,所以[0..9]
变成一个 int 列表的列表,那么你的应用程序就有意义了。
但我想你想用inits
or tails
功能。让我们知道您想要实现什么,以便我们帮助解决。
一个最小的修复是添加prevDigits
作为一个论据map
并使用 lambda 抽象来忽略未使用的prevDigit
:
| otherwise = sum (map (\prevDigit -> betaRest (n - 1) [0..9]) prevDigits)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)