Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单OCaml运动_Ocaml - Fatal编程技术网

简单OCaml运动

简单OCaml运动,ocaml,Ocaml,我试图通过Jason Hickey的笔记自学OCaml,下面的练习让我很为难。 问题:写一个函数求和,给定两个整数界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 但是它不起作用,产生了一个类型错误。函数应用程序(将函数名绑定到它们的参数)在OCaml中具有最高的优先级。所以,你需要注意括号。我不

我试图通过Jason Hickey的笔记自学OCaml,下面的练习让我很为难。 问题:写一个函数求和,给定两个整数界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

但是它不起作用,产生了一个类型错误。

函数应用程序(将函数名绑定到它们的参数)在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
(尽管为了可读性,我通常会在最后一行加括号,否则
(fm)+(sum n(m+1)f)
) 没有括号的情况是,它将其视为
(fm)+(sum n m)+(1f)
,这产生了一个错误,
sum n m
没有int类型,因为它是一个具有更复杂类型的部分函数应用程序


一般来说,当表达式作为参数传递给函数时,总是需要将其括起来。另一方面,如果您确实想将加号函数作为参数传递,您可以将其放在括号中(例如:
sumn(+)
(尽管在本例中不会键入check,因为+需要两个数字))。

谢谢。这两个答案都很有启发性。我接受了第一个答案,只是因为它是第一个。类型错误uu-sum n m uu'error:此表达式的类型为('a->int)->'b,但表达式的类型应为int'。我已经得到了一个答案,但我想如果我仔细阅读这篇文章,我有机会自己弄明白。