2011-10-15 63 views
4

我试图通过Jason Hickey笔记教自己OCaml,下面的练习让我难住了。 问题:编写函数总和给出两个整数范围 m,n和函数 f计算总和。 我想这一点:简单的OCaml练习

 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

什么是类型错误? –

+0

类型错误_ sum n m_'错误:该表达式具有类型('a - > int) - >'b但是表达式期望为int类型'。我已经得到了答案,但我想如果我更仔细地阅读这个问题,我有机会自己弄清楚。 – Torus

回答

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类型的错误,因为它是一个更复杂类型的部分功能应用程序。

作为一般规则,当表达式作为参数传递给函数时,它总是需要加括号。在相关说明中,如果您真的想要将加号函数作为参数传递,您可以将其放在括号内(例如:sum m n (+)(尽管在这种情况下不会键入check,因为+需要两个数字))。

6

函数应用程序(函数名称与其参数的绑定)在OCaml中具有最高的优先级。所以,你需要看你的括号。我没有给出解决方案,因为自己弄清楚它可能更有趣。

+0

谢谢。这两个答案都很有启发性。我首先接受了第一个答案。 – Torus