我正在评估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)
我的问题是
()意思let p5 () = print_int 5;;?-和()意味着# 5- : unit = ()什么?p4功能吗?4开始就有# 4val p4 : unit = ()?()可以在Ocaml代码中使用隐藏副作用,有人能给我看一个例子吗?LiK*_*Kao 11
这里有一些答案:
()是单位类型值.单位类型是只有一个值的类型.这通常用于生成函数,这些函数要么没有任何意义,要么没有任何意义.请记住,在OCaml中,所有函数总是必须返回一些东西并采取一些参数,因此单位类型用于解决此限制.可以认为这类似于voidC,C++或Java中的类型.5由打印print_int功能,而不是由顶层.只有在- : unit = ()没有的情况下才会返回5.toplevel告诉你它没有创建任何新的绑定-,并且最后返回的值是类型unit并且具有值().4由打印print_int功能.此时,toplevel告诉你,它创建了一个新绑定p4,该变量带有一个类型的值,unit并且存储的值是().()不习惯隐藏副作用.它通常用于创建具有副作用的函数,因此不需要采用任何类型的参数.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并具有值().