Ocaml中的括号

Sof*_*mur 5 ocaml

我正在评估Ocaml顶级代码中一段非常简单的代码:

let p5 () = print_int 5;;
p5 ();;

print_string "*************************";;

let p4 = print_int 4;;
p4;; 
Run Code Online (Sandbox Code Playgroud)

它返回:

val p5 : unit -> unit = <fun>
#   5- : unit = ()
#   *************************- : unit = ()
#   4val p4 : unit = ()
#   - : unit = ()
Run Code Online (Sandbox Code Playgroud)

我的问题是

  1. 什么()意思let p5 () = print_int 5;;?
  2. 做什么-和()意味着# 5- : unit = ()什么?
  3. 是p4功能吗?
  4. 为什么一4开始就有# 4val p4 : unit = ()?
  5. 似乎()可以在Ocaml代码中使用隐藏副作用,有人能给我看一个例子吗?

LiK*_*Kao 11

这里有一些答案:

  1. ()是单位类型值.单位类型是只有一个值的类型.这通常用于生成函数,这些函数要么没有任何意义,要么没有任何意义.请记住,在OCaml中,所有函数总是必须返回一些东西并采取一些参数,因此单位类型用于解决此限制.可以认为这类似于voidC,C++或Java中的类型.
  2. 有两行交错.在5由打印print_int功能,而不是由顶层.只有在- : unit = ()没有的情况下才会返回5.toplevel告诉你它没有创建任何新的绑定-,并且最后返回的值是类型unit并且具有值().
  3. 不,它不需要任何参数,因此它不是一个函数.
  4. 再次有两行交错.在4由打印print_int功能.此时,toplevel告诉你,它创建了一个新绑定p4,该变量带有一个类型的值,unit并且存储的值是().
  5. 不,()不习惯隐藏副作用.它通常用于创建具有副作用的函数,因此不需要采用任何类型的参数.


Jef*_*eld 6

LiKao已经解释了所有关键点,但我认为如果你一次输入一行定义可能更有意义,这将显示哪些响应来自哪些输入.此人输入的行开头#.

# let p5 () = print_int 5;;
val p5 : unit -> unit = <fun>
Run Code Online (Sandbox Code Playgroud)

这将p5定义为接受类型unit值并返回类型值的函数unit.类型单位只有一个值,写为().所以这些正是你所询问的括号(我认为).请注意,()定义中出现的是函数接受的值的模式.作为模式,()匹配自身(就像用作模式的所有常量一样).

# p5 ();;
5- : unit = ()
Run Code Online (Sandbox Code Playgroud)

这有点令人困惑.这5是由你的功能写的p5.其余的是OCaml顶级的回应.它表示你的表达式的结果是类型unit并具有值().它是有道理的,print_int属于类型int -> unit.

# print_string "*************************";;
*************************- : unit = ()
Run Code Online (Sandbox Code Playgroud)

这里有类似的混乱.星号*是由print_string.其余的显示结果,这也是unit有价值的类型().

# let p4 = print_int 4;;
4val p4 : unit = ()
Run Code Online (Sandbox Code Playgroud)

这里也是一样的.在4由写入print_int.其余部分显示顶级已定义一个名称,p4其类型为unit,其值为().同样,这是有道理的,因为print_int返回unit类型并且()是该类型的唯一值.你可以从它的类型来p4判断它不是一个函数.函数->在类型中有一个箭头(). p4只是一种类型的价值unit.

# p4;;
- : unit = ()
Run Code Online (Sandbox Code Playgroud)

在这里,您向顶层询问类型和值p4,并且它(再次)告诉您p4类型unit并具有值().