在OCaml中传递零算术lambda函数的短方法

在OCaml中传递零算术lambda函数的短方法,ocaml,Ocaml,有没有什么捷径可以把零算术函数传递给另一个函数。现在我是这样做的: let f a b c = ...;; a (fun () -> f a b c) let const x _ = x a (const (f a b c)) 第二行有语法上的甜点吗?如果f被定义为fabc()=…,你可以只做a(fabc),但除此之外,没有比这更短的方法了 如果需要,可以这样定义函数const: let f a b c = ...;; a (fun () -> f a b c) let co

有没有什么捷径可以把零算术函数传递给另一个函数。现在我是这样做的:

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

第二行有语法上的甜点吗?

如果
f
被定义为
fabc()=…
,你可以只做
a(fabc)
,但除此之外,没有比这更短的方法了

如果需要,可以这样定义函数
const

let f a b c = ...;;
a (fun () -> f a b c)
let const x _ = x
a (const (f a b c))
然后像这样使用它:

let f a b c = ...;;
a (fun () -> f a b c)
let const x _ = x
a (const (f a b c))
但这并不比使用
fun
短(或更清晰)。而且它会立即计算fabc,这可能不是您想要的

PS:me中的学究需要指出,
(fun()->…)
是一元函数,ocaml中没有零算术函数。

怎么样:

lazy (f a b c)
要“应用”,请使用
Lazy.force
,如中所示:

# let l = lazy (2+2) ;;
val l : int lazy_t = <lazy>
# Lazy.force l ;;
- : int = 4
#让l=lazy(2+2);;
val l:int lazy\u t=
#懒惰的;懒惰的;;
-:int=4

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

const的问题是
(fun()->…)
通常意味着延迟代码的计算,而
const
函数,由于OCaml严格的评估,无法执行。@gasche:关于延迟评估,这一点很好。是的,我无意中写了SML,修复了这个问题。谢谢,我想我会继续我目前的乐趣()->……`方法