为什么使用_防止产生警告

时间:2019-04-14 14:18:04

标签: ocaml

我有以下代码(这是一个测试,因此它没有任何作用)

CommonDataKinds.Phone.EMAIL

最后使用了语法:let test k = let rec aux = function |0 -> 0 |z when z = 2 -> raise Exit |_ -> aux (k-1) in try let _ = aux k in true with Exit -> false ,对我来说,这只是一种语法,当您不知道可用于定义函数的名称时。

但是,如果我执行以下操作:

let _

我得到一个警告:“变量b未使用”,我不明白为什么let test k = let rec aux = function |0 -> 0 |z when z = 2 -> raise Exit |_ -> aux (k-1) in try let b = aux k in true with Exit -> false let _之间存在差异?

例如,我知道在处理单元类型时,通常使用语法:let b。但是我在这样做时没有任何警告:

let ()

即使我没有使用:

let b = print_int 2 

那么let () = print_int 2 有什么特别之处?

谢谢!

2 个答案:

答案 0 :(得分:0)

第二个代码会给您一个警告,因为您定义了包含值的变量b,并且此后不再使用它。 如果您不想使用任何表达式的结果,最好的用法是使用'let _ ='构造丢弃它的结果(它告诉您希望对表达式进行评估,以免产生潜在的副作用,但不要在意保留其结果)。

对于您问题的第二部分,我认为与顶部循环相关的规则不同,因此行为可能不具有可比性。在第一部分中,在函数内定义b,在第二部分中,在顶部循环内定义b。在顶部循环中,您可以定义不使用警告就不会使用的变量。

答案 1 :(得分:0)

这是编译器认可的约定,表示您将不使用计算结果,例如

let a = 5 + 6 in
()

将(或不会根据您的警告设置)触发未使用的变量警告,因为您已将结果明确绑定到变量a,但未在其余计算中使用它。在命令式语言中,很常见的是计算表达式的副作用并忽略产生的值(如果有)。由于OCaml是一种功能语言,其中使用值来生成值,因此当您忘记使用绑定变量时,它通常是错误的指示。

因此,要明确告诉编译器您正在忽略该值,可以在变量下加下划线,例如

let _unusued = 5 + 6 in 
()

您可以仅使用通配符模式_(也以下划线开头)。