Nad*_*oun 8 ocaml functional-programming
OCaml unit -> unit和'a -> 'aOCaml有什么区别?
例如:
# let f g a = if (g a > a) then a ;;
val f : (unit -> unit) -> unit -> unit = <fun>
# let f g a = if (g a > a ) then a else a;;
val f : ('a -> 'a) -> 'a -> 'a = <fun>
Run Code Online (Sandbox Code Playgroud)
为什么第一个给出unit -> unit第二个'a -> 'a?
Éti*_*lon 10
请注意,在OCaml中,if是一个表达式:它返回一个值.
理解你的问题的关键是
if condition then a
Run Code Online (Sandbox Code Playgroud)
相当于
if condition then a else ()
Run Code Online (Sandbox Code Playgroud)
输入规则if如下:
bool换句话说,在if cond then a,a应该有类型unit.
unit是函数不返回任何内容时使用的类型(基本上是打印内容的函数)
'a是中性型。它是任何类型的占位符。
第一个变体中的表达式if没有else子句,因此表达式的 true 分支if必须具有类型unit。这意味着 的类型a也必须是unit,并且g必须具有类型unit -> unit。
在第二种变体中,由于else子句的原因,唯一的要求是表达式的 true 和 false 分支if具有相同的类型,因此类型泛化, 的类型也是如此g。