OCaml返回值

Ser*_*lla 8 ocaml return-value

在"使用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`
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这个问题2的返回值不同unit,因为我的意图不是返回2,而是返回3.我理解它的方式,我最后一条指令之前的任何指令都不是函数的返回值,为什么警告呢?

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

谢谢你的帮助.

ako*_*ski 5

那么,该警告是有,因为你产生价值,但那么就不要使用它可能(与事实非常往往是)说明你正在做的事情是错误的。如果您不同意此政策,您可以关闭该警告。但像往常一样,最好不要这样做,在这种情况下,如果您真的不需要表达式的值,您确实可以使用 ignore 或将其绑定到_,如let _ = f() in ....


ygr*_*rek 5

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

let (_:type) = e1 in
e2
Run Code Online (Sandbox Code Playgroud)

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