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

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表达式与分支具有相同的类型

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


Tit*_*lle 8

unit是函数不返回任何内容时使用的类型(基本上是打印内容的函数)

'a是中性型。它是任何类型的占位符。

  • 单位类型一开始是一个奇怪的概念。就我个人而言,我将其翻译为“副作用”,如果函数在输入处有来自副作用的数据,我会添加一个单位类型参数,如果输出有副作用,我会从单位类型返回单位值。这是一种使用“警告副作用区域”来记录代码的方法。 (2认同)

Flo*_*mer 4

第一个变体中的表达式if没有else子句,因此表达式的 true 分支if必须具有类型unit。这意味着 的类型a也必须是unit,并且g必须具有类型unit -> unit

在第二种变体中,由于else子句的原因,唯一的要求是表达式的 true 和 false 分支if具有相同的类型,因此类型泛化, 的类型也是如此g

  • @AhmedBaoun 将单位类型视为 void 类型可能会有所帮助 (3认同)
  • 单位类型是一种只有一个值的类型,写作“()”。如果你写“if c then a”,就会有一个隐式的“else ()”分支。 (2认同)