函数类型('a - >'a) - > int - >'a - >'a和('a - >'a) - > int - >('a - >'a)之间有什么区别?

Swa*_*air 1 ocaml type-systems functional-programming

当我写一个Ocaml函数以递归方式组合相同的函数n次时,我这样做了:

let rec compose f n = 
  (fun x -> if n = 1 then f x else ((compose f (n-1))) (f x));; 
Run Code Online (Sandbox Code Playgroud)

它给出了类型

val compose : ('a -> 'a) -> int -> 'a -> 'a = <fun>
Run Code Online (Sandbox Code Playgroud)

类型有什么区别

('a -> 'a) -> int -> 'a -> 'a
Run Code Online (Sandbox Code Playgroud)

并输入

('a -> 'a) -> int -> ('a -> 'a)
Run Code Online (Sandbox Code Playgroud)

类似的组合函数如何看待后一种类型?

ivg*_*ivg 6

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