Functional programming 函数类型(';a->;';a)>;int->';a->';a和(';a->;';a)>;int->;(';a->;';a)?

Functional programming 函数类型(';a->;';a)>;int->';a->';a和(';a->;';a)>;int->;(';a->;';a)?,functional-programming,ocaml,type-systems,Functional Programming,Ocaml,Type Systems,当我编写一个Ocaml函数递归地编写同一个函数n次时,我做到了: let rec compose f n = (fun x -> if n = 1 then f x else ((compose f (n-1))) (f x));; 它给出了类型 val compose : ('a -> 'a) -> int -> 'a -> 'a = <fun> 和类型 ('a -> 'a) -> int -> ('a -> 'a)

当我编写一个Ocaml函数递归地编写同一个函数n次时,我做到了:

let rec compose f n = 
  (fun x -> if n = 1 then f x else ((compose f (n-1))) (f x));; 
它给出了类型

val compose : ('a -> 'a) -> int -> 'a -> 'a = <fun>
和类型

('a -> 'a) -> int -> ('a -> 'a)
?


对于后一种类型,类似的compose函数看起来如何?

它们之间没有区别。但有时库的作者使用parens表示,计算实际上是分阶段进行的,因此最好部分应用它,这样可以得到更有效的函数,而不是每次都应用它。但是从类型系统的角度来看,这些函数是完全相同的,因为
->
类型运算符关联到右侧。

它们之间没有区别。但有时库的作者使用parens表示,计算实际上是分阶段进行的,因此最好部分应用它,这样可以得到更有效的函数,而不是每次都应用它。但是从类型系统的角度来看,这些函数是完全相同的,因为
->
类型操作符关联到右侧。

作为@ivg答案的补充,我犯了一个错误。考虑这两个函数类型相同:<代码> int > int > int <代码>。(
添加用于粘贴到顶层)

如果你部分申请

let f_1 = f 1;;
let f'_1 = f' 1;;

你会看到区别的。我想的是
f
f'
做的事。实际上,Ocaml非常渴望,但并不急于在部分函数应用程序中开始计算,直到参数用完为止。为了指出区别,可以将
f'
的类型写为
int->(int->int)

作为@ivg答案的补充,我犯了一个错误。考虑这两个函数类型相同:<代码> int > int > int <代码>。(
添加用于粘贴到顶层)

如果你部分申请

let f_1 = f 1;;
let f'_1 = f' 1;;
你会看到区别的。我想的是
f
f'
做的事。实际上,Ocaml非常渴望,但并不急于在部分函数应用程序中开始计算,直到参数用完为止。为了指出区别,可以将
f'
的类型写为
int->(int->int)

let f_1 = f 1;;
let f'_1 = f' 1;;