我正试图通过Jason Hickey的笔记自学OCaml,以下练习让我难过。 问题:写一个函数 sum 给出两个整数边界 m,n ,函数 f 计算求和。 我正在尝试这个:
let rec sum m n f=
if m>n then 0
else if m=n then f n
else f m + sum n m+1 f
但它不起作用,产生类型错误。
答案 0 :(得分:7)
你需要一些括号。
let rec sum m n f=
if m>n then 0
else if m=n then f n
else f m + sum n (m+1) f
(虽然为了便于阅读,我通常会将最后一行括起来,而不是(f m) + (sum n (m+1) f)
。)
没有括号的情况是,它将它视为(f m) + (sum n m) + (1 f)
,它产生sum n m
没有int类型的错误,因为它是一个类型更复杂的部分函数应用程序。
作为一般规则,当表达式作为参数传递给函数时,它总是需要用括号括起来。在相关的说明中,如果你真的想要将plus函数作为参数传递,你可以将它放在括号中(例如:sum m n (+)
(虽然在这种情况下不会键入check,因为+期望两个数))。
答案 1 :(得分:6)
函数应用程序(函数名称与其参数的绑定)在OCaml中具有最高优先级。所以,你需要看你的括号。我没有给出解决方案,因为自己弄清楚它可能会更有趣。