SML - 错误:运算符不是函数[tycon mismatch]

时间:2016-12-02 12:31:29

标签: 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)

但我在sumDigits (factLarge 100)收到错误,我不知道如何修复它。

20.sml:8.19-11.26错误:运算符不是函数[tycon mismatch]   operator:IntInf.int   表达式:     (factLarge(n - 1))sumDigits

1 个答案:

答案 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的定义上放置适当的类型注释才能使其正常工作。由于这似乎是家庭作业,我将留给你锻炼。