OCaml返回值

时间:2011-06-15 06:40:58

标签: return-value ocaml

在“使用OCaml开发应用程序”一书中,有关于返回值的以下说明:

  

当分号前面的值被丢弃时,Objective CAML会在不是单位类型时发出警告。

# 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,而是返回{{} 1}}。我理解它的方式,我最后一条指令之前的任何指令都不是函数的返回值,为什么警告?

我的代码中一直有这个警告,我越来越清楚,我真的不明白返回值在OCaml中是如何工作的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

考虑表达式e1 ; e2。根据定义 - 评估整个表达式会导致对e1e2的评估,整个表达式的结果值是e2的值。 e1的值结果将被丢弃。如果e1的类型为unit,则它不是问题,因为它具有唯一的居民值()。对于丢弃e1的结果的所有其他类型,意味着丢失可能不是程序员想要的信息,因此警告。程序员必须明确地忽略结果值,使用ignore

let (_:type) = e1 in
e2

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

答案 1 :(得分:4)

嗯,警告是存在的,因为你产生一个值然后不使用它的事实可能(并且非常经常是)表明你做错了什么。如果您不同意此政策,可以关闭该警告。但是像往常一样,不这样做是一种很好的做法,在这种情况下,如果你真的不需要表达式的值,你确实可以使用ignore或将其绑定到_,就像在let _ = f() in ...中一样