Ocaml 为什么使用uu防止出现警告

Ocaml 为什么使用uu防止出现警告,ocaml,Ocaml,我有以下代码(这是一个测试,所以它没有做任何有趣的事情) 最后是语法的使用:let,对我来说,它只是一种语法,当你不知道可以用来定义函数的名称时 但如果我做了以下几点: 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 -&

我有以下代码(这是一个测试,所以它没有做任何有趣的事情)

最后是语法的使用:
let
,对我来说,它只是一种语法,当你不知道可以用来定义函数的名称时

但如果我做了以下几点:

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
我得到一个警告,比如:“变量b未使用”,我不明白为什么
let
let b
之间有区别

例如,我知道在处理单元类型时,通常使用语法:
let()
。但我在做以下事情时没有任何警告:

let b = print_int 2 
即使我没有使用:

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


谢谢大家!

您的第二个代码有一个警告,因为您定义了包含一个值的变量b,并且之后不使用它。 如果您不想使用任何表达式的结果,最好的用法是使用“let=”构造放弃其结果(它告诉您希望对表达式求值,以防潜在的副作用,但不介意保留其结果)


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

这是一种由编译器识别的约定,用于指示您不使用计算结果,例如

let a = 5 + 6 in
()
会(或不会,取决于您的警告设置)触发未使用的变量警告,因为您明确地将结果绑定到变量
a
,但在剩余的计算中不使用它。在命令式语言中,计算表达式的副作用并忽略生成的值(如果有的话)是很常见的。由于OCaml是一种函数式语言,其中的值用于生成值,因此当您忘记使用绑定变量时,它通常是错误的指示器

因此,要明确地告诉编译器您忽略了该值,可以用下划线开始变量,例如

let _unusued = 5 + 6 in 
()

您可以只使用一个通配符
(它也以下划线开头)

可能是重复的,因为这就是语言的设计方式?不知道你在寻找什么样的答案。
let _unusued = 5 + 6 in 
()