保证在OCaml中赋值给函数的返回值

Eli*_*Eli 6 ocaml functional-programming variable-assignment

从Lisp来到OCaml,我发现自己在函数何时返回以及何时不返回时非常困惑.我想念我的魔术报价!值得庆幸的是,大多数时候,OCaml似乎能够自动地知道我什么时候需要评估功能,何时不需要.但是,我经常发现自己试图在let表达式中分配函数的返回值,如下所示.

let start = Sys.time in
(*
 * do something here
 *)
 ;
let ending = Sys.time in
Printf.printf "did something in %f seconds\n" (ending -. start)
Run Code Online (Sandbox Code Playgroud)

但后来ocamlc抱怨

Error: This Expression has type unit -> float
       but an expression was expected of type float
Run Code Online (Sandbox Code Playgroud)

告诉我开始和结束都是必然的Sys.time,而不是返回值Sys.time.

这种行为我试图不是OCamly吗?我想以另一种方式做事吗?我只是缺少一些完全明显的东西吗?

sep*_*p2k 10

将函数应用于参数时,将评估函数.即,当你这样做时f,f永远不会得到评估.当你这样做时f x,f总是得到评估.这没有什么神奇之处.

正如您正确指出的那样,Sys.time是一个函数(类型unit -> float)并且let start = Sys.time只是将该函数赋值给start.

要获得您想要的行为let start = Sys.time (),将函数应用于Sys.time参数()(这是类型的唯一值unit).