在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,修复了这个问题。谢谢,我想我会继续我目前的乐趣()->……`方法