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

时间:2010-12-18 19:03:44

标签: ocaml

是否有任何简短的方法可以将零功能传递给另一个功能。现在我这样做:

let f a b c = ...;;
a (fun () -> f a b c)

第二行是否有任何语法糖?

2 个答案:

答案 0 :(得分:10)

怎么样:

lazy (f a b c)

要“申请”,请使用Lazy.force,如:

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

其含义与(fun () -> ...)... ()并不完全相同,而且并不是很短。也许如果你真的需要为lazyfun () ->提供方便的语法,你应该使用camlp {4,5}扩展名来实现这一目的。

答案 1 :(得分:6)

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

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

let const x _ = x

然后像这样使用它:

a (const (f a b c))

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

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