条款的右侧与功能结果sml不一致

时间:2012-05-31 15:07:16

标签: sml smlnj

fun can_move    0 0 0 nil = false
|   can_move    limit_down V 0 a  = true
|   can_move    limit_down V count a =  if  ((V-limit_down)>hd a) then false else               can_move limit_down V (count-1) tl a ;

嘿这个我的代码我只想检查值V-limit_down是否低于int列表中的数字a。我想从列表中检查的参数数量是V / 10。例如,如果我有20 V,那么我想检查列表的前两个参数。为什么我会收到此错误?

can_move.sml:1.6-3.114 Error:right-hand-side of clause doesn't agree with function     result type
[tycon mismatch] 
expression: int -> int -> int list -> bool
result type: int -> int -> (Z' list -> 'Z list) -> int list -> bool
in declaration:

can_move (fn arg =) (fn <pat> => <exp>))

1 个答案:

答案 0 :(得分:2)

看起来您在模式匹配的最后右侧忘记了括号。在递归调用can_move limit_down V (count-1) tl a中,请注意您的最后一个参数是tl a。通常,解析器可以发现这是一个函数应用程序。不幸的是,当应用程序的结果是另一个应用程序的一部分时,它是不明确的,就像它在这里一样。

解决方案是将呼叫括起来:can_move limit_down V (count-1) (tl a)