OCaml返回值

8
在书籍“使用OCaml开发应用程序”中,关于返回值有以下解释:

As the value preceding a semicolon is discarded, Objective CAML gives a warning when it is not of type unit.

# print_int 1; 2 ; 3 ;;
Characters 14-15:
Warning: this expression should have type unit.
1- : int = 3


To avoid this message, you can use the
function ignore:

# print_int 1; ignore 2; 3 ;; 
1- : int = 3`
我不明白为什么2的返回值与unit不同会成为问题,因为我的意图不是返回2,而是返回3。据我理解,在最后一条指令之前的任何指令都不是函数的返回值,那么为什么会出现警告呢?
我在代码中一直遇到这个警告,很明显我并不真正了解OCaml中返回值的工作原理。
感谢您的帮助。
2个回答

7
考虑表达式e1; e2。按照定义,评估整个表达式的结果是评估e1,然后是e2,整个表达式的结果值是e2的值。 e1的值结果被丢弃,如果e1的类型是unit,那么这不是问题,因为它只有一个单一的值()。对于所有其他类型,丢弃e1的结果意味着丢失信息,这可能不是程序员想要的,因此会发出警告。程序员必须明确忽略结果值,使用ignore或者使用
let (_:type) = e1 in
e2

类型注释可以省略,但确保e1完全评估为预期类型(而不是部分应用)可能很有用。


部分应用将导致另一个警告 :) - akoprowski
1
这是关于类型注释的有趣笔记,这可能是我从未考虑过的事情。 - Jeff Mercado
@akoprowski:不行。let g () = let f x y = x + y in let _ = f 2 in f 1 2 - ygrek
@ygrek:好的,没错,使用“_”绑定你无法得到它,但是当你使用忽略时let g () = let f x y = x + y in ignore (f 2); f 1 2,你可以得到它。 - akoprowski
@akoprowski:的确,ignore 在编译器中是特殊处理的。 - ygrek

5

好的,这个警告是因为你产生了一个值但却没有使用它,这可能(并且经常)表明你正在做一些错误的事情。如果你不同意这个策略,你可以关闭这个警告。但通常最好不要这样做,如果你真的不需要一个表达式的值,你可以使用ignore或将其绑定到_,例如let _ = f() in ...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接