简单的OCaml练习

时间:2011-10-15 01:06:08

标签: ocaml

我正试图通过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

但它不起作用,产生类型错误。

2 个答案:

答案 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中具有最高优先级。所以,你需要看你的括号。我没有给出解决方案,因为自己弄清楚它可能会更有趣。