在OCaml中传递零arity lambda函数的简短方法

Nut*_*tel 6 ocaml

是否有任何简短的方法将零 - arity函数传递给另一个函数.现在我这样做:

let f a b c = ...;;
a (fun () -> f a b c)
Run Code Online (Sandbox Code Playgroud)

第二行有任何语法糖吗?

Pas*_*uoq 10

怎么样:

lazy (f a b c)
Run Code Online (Sandbox Code Playgroud)

要"申请",请使用Lazy.force,如:

# let l = lazy (2+2) ;;
val l : int lazy_t = <lazy>
# Lazy.force l ;;
- : int = 4
Run Code Online (Sandbox Code Playgroud)

意思并不完全相同(fun () -> ...),... ()而且它并不是真的更短.也许如果你真的需要为它们提供方便的语法,lazy或者fun () ->你应该使用camlp {4,5}扩展来达到这个目的.


sep*_*p2k 6

如果f被定义为f a b c () = ...,你可以做a (f a b c),但除此之外,没有更短的方法.

如果你愿意,你可以const像这样定义函数:

let const x _ = x
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

a (const (f a b c))
Run Code Online (Sandbox Code Playgroud)

但这并不比使用更短(或更清晰)fun.它f a b c也会立即评估,这可能不是你想要的.

PS:我的学究者需要指出这(fun () -> ...)是一个一元函数,并且ocaml中没有零元素函数.

  • `const`的问题是`(fun() - > ...)`通常意味着延迟代码的评估,由于OCaml严格评估,`const`函数无法做到. (2认同)