ML中的重载冲突(SML / NJ)

时间:2015-05-20 03:47:52

标签: sml smlnj

我为ML编写了以下代码:

fun get_digits (0, s) = s
        | get_digits (d, s) = get_digits( d div 10, (d mod 10) :: s)
        | get_digits n = get_digits( n div 10, [n mod 10] );

但它给了我以下错误:

Error: Operator and operand do not agree (overload conflict)
operator domain: [mod ty] * [mod ty]
operand: ([mod ty] * [mod ty] list) * [int ty]
in expression
n div 10
Error: Operator and operand do not agree (overload conflict)
operator domain: [mod ty] * [mod ty]
operand: ([mod ty] * [mod ty] list) * [int ty]
in expression
n mod 10

有人可以解释这意味着什么以及我应该做出哪些改变?提前致谢

1 个答案:

答案 0 :(得分:3)

你的前两个案例说get_digits的参数是一对整数和一个列表。

然后你的第三个案例会尝试将divmod应用于这样一对,但这不起作用。

由于您无法定义一个以数字或一对作为参数的函数,因此您需要使用两个函数:

fun get_digits' (0, s) = s
  | get_digits' (d, s) = get_digits' (d div 10, (d mod 10)::s);

fun get_digits n = get_digits' (n div 10, [n mod 10]);

当然,您可以在get_digits中本地定义辅助函数。