OCaml中unit -> unit
和'a -> 'a
之间有什么区别?
例如:
# 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>
为什么第一个提供unit -> unit
和第二个'a -> 'a
?
答案 0 :(得分:8)
请注意,在OCaml中,if
是一个表达式:它返回一个值。
了解问题的关键是
if condition then a
相当于
if condition then a else ()
if
的输入规则如下:
bool
换句话说,在if cond then a
中,a
应该有unit
类型。
答案 1 :(得分:4)
第一个变体中的if
表达式没有else
子句,因此if
表达式的真分支必须具有类型unit
。这意味着a
的类型也必须为unit
,g
必须为unit -> unit
类型。
在第二个变体中,由于else
子句,唯一的要求是if
表达式的真分支和假分支具有相同的类型,因此类型一般化,所以类型g
。
答案 2 :(得分:4)
unit
是函数返回任何内容时使用的类型(基本上是打印东西的函数)
'a
是中性的。它是任何类型的占位符。
答案 3 :(得分:2)
第一个变体中的if表达式没有else子句,因此if表达式的true分支必须具有type单元。这意味着a的类型也必须是单位,而g必须具有类型单位 - &gt;单元。
在第二个变体中,由于else子句,唯一的要求是if表达式的true和false分支具有相同的类型,因此类型一般化,g的类型也是如此。 由Florian Weimer回答