我正在尝试创建一个程序,它将对一个大因子的数字求和,这就是我正在做的事情:
fun sumDigits n =
if n < 10 then n
else
n mod 10 + sumDigits(n div 10)
fun factLarge 1 = IntInf.toLarge 1
| factLarge n = IntInf.toLarge n * factLarge(n-1)
sumDigits (factLarge 100)
但我在sumDigits (factLarge 100)
收到错误,我不知道如何修复它。
20.sml:8.19-11.26错误:运算符不是函数[tycon mismatch] operator:IntInf.int 表达式: (factLarge(n - 1))sumDigits
答案 0 :(得分:2)
该特定错误是由于您必须将代码粘贴到REPL中的方式。它无法确定factLarge
定义的结束位置。在该定义的末尾加上一个分号,这个错误就会消失(或者更好地使用命令use filename.sml;
而不是复制粘贴代码):
fun sumDigits n =
if n < 10 then n
else
n mod 10 + sumDigits(n div 10);
fun factLarge 1 = IntInf.toLarge 1
| factLarge n = IntInf.toLarge n * factLarge(n-1);
sumDigits (factLarge 100);
不幸的是,这会导致更深层错误的表面错误:
stdIn:40.1-40.26 Error: operator and operand don't agree [tycon mismatch]
operator domain: int
operand: IntInf.int
in expression:
sumDigits (factLarge 100)
问题是您的sumDigits
期待的是int
,而不是IntInf.int
。
您必须在sumDigits
的定义上放置适当的类型注释才能使其正常工作。由于这似乎是家庭作业,我将留给你锻炼。