gpt4 book ai didi

ocaml - "let ()="和 "let _="有什么区别;

转载 作者:行者123 更新时间:2023-12-03 23:24:52 27 4
gpt4 key购买 nike

let () = Random.self_init();;
let _ = Random.self_init ();;
│- : unit = ()

似乎“让()”什么也没返回?

真挚地!

最佳答案

let是用于定义新变量的关键字,如以下构造:

let pattern = expr

例如
let a = 2

赋值 2a . (请注意,这不是为已经存在的变量赋值的方法,但这是另一个主题)。

但是 = 左侧的模式标志可以不仅仅是一个名字。例如
let (a,b) = (42,"foo")

定义了 ab , 分别为 42"foo" .
当然,双方的类型必须匹配。
这里是这种情况:双方都是 int * string 类型.
= 右侧的表达式符号也可以详细说明,例如
let foo =
let temp = String.make 10 'a' in
temp.[2] <- 'b';
temp

定义 foo作为字符串 "aabaaaaaaa" . (作为旁注,它还确保 temp 是此代码片段的本地)。

现在,让我们使用两者:在左边,模式匹配 unit 类型的值。 ,右边是 unit 类型的表达式:
let () = Printf.printf "Hello world!\n"

这解释了 let () =构造。
现在,关于 let _ ,只需知道 _可以在模式中用作通配符:它匹配任何类型的值并且不绑定(bind)任何名称。例如
let (a,_) = (42,"foo")

定义 a42 ,并丢弃值 "foo" . _意思是“我知道这里有一些东西,我明确表示我不会使用它,所以我没有命名它”。这里 _用于匹配 string 类型的值,但它可以匹配任何类型的值,例如 int * string :
let _ = (42,"foo")

它没有定义任何变量,也不是很有用。当右手边有副作用时,这样的构造很有用,如下所示:
let _ = Printf.printf "Hello world!\n"

这解释了问题的第二部分。

实用目的

两者都被使用,使用一个或另一个是一个口味问题。
let () =稍微安全一些,因为它让编译器检查右侧是 unit 类型.
除单位以外的任何其他类型的值通常都是错误。
let _ =稍微短一些(我见过这个论点)。 (请注意,使用自动关闭括号的编辑器,击键次数是相同的 ;-)

关于ocaml - "let ()="和 "let _="有什么区别;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com