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