单位类型与'a in ocaml之间的差异

时间:2017-11-16 20:37:57

标签: functional-programming ocaml

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

4 个答案:

答案 0 :(得分:8)

请注意,在OCaml中,if是一个表达式:它返回一个值。

了解问题的关键是

if condition then a

相当于

if condition then a else ()

if的输入规则如下:

  • 条件应为bool
  • 类型
  • 两个分支应具有相同的类型
  • 整个if表达式与分支
  • 的类型相同

换句话说,在if cond then a中,a应该有unit类型。

答案 1 :(得分:4)

第一个变体中的if表达式没有else子句,因此if表达式的真分支必须具有类型unit。这意味着a的类型也必须为unitg必须为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回答