我试图通过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
,但它不工作,产生了错误类型。
我试图通过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
,但它不工作,产生了错误类型。
你需要一些括号。
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,因为+需要两个数字))。
函数应用程序(函数名称与其参数的绑定)在OCaml中具有最高的优先级。所以,你需要看你的括号。我没有给出解决方案,因为自己弄清楚它可能更有趣。
谢谢。这两个答案都很有启发性。我首先接受了第一个答案。 – Torus
什么是类型错误? –
类型错误_ sum n m_'错误:该表达式具有类型('a - > int) - >'b但是表达式期望为int类型'。我已经得到了答案,但我想如果我更仔细地阅读这个问题,我有机会自己弄清楚。 – Torus