是否有任何简短的方法可以将零功能传递给另一个功能。现在我这样做:
let f a b c = ...;;
a (fun () -> f a b c)
第二行是否有任何语法糖?
答案 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 () -> ...)
和... ()
并不完全相同,而且并不是很短。也许如果你真的需要为lazy
或fun () ->
提供方便的语法,你应该使用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
,这可能不是你想要的。
(fun () -> ...)
是一元函数,并且ocaml中没有零度函数。