다른 함수에 zero-arity 함수를 전달할 짧은 방법이 있습니까? 지금은 다음과 같이합니다.OCaml에서 zero-arity λ 함수를 전달하는 짧은 방법
let f a b c = ...;;
a (fun() -> f a b c)
두 번째 줄에는 구문 설탕이 있습니까?
다른 함수에 zero-arity 함수를 전달할 짧은 방법이 있습니까? 지금은 다음과 같이합니다.OCaml에서 zero-arity λ 함수를 전달하는 짧은 방법
let f a b c = ...;;
a (fun() -> f a b c)
두 번째 줄에는 구문 설탕이 있습니까?
에 대해 어떻게 :
# let l = lazy (2+2) ;;
val l : int lazy_t = <lazy>
# Lazy.force l ;;
- : int = 4
의미는 정확히 (fun() -> ...)
및 ...()
과 동일하지 않습니다 그것은 정말 짧은 아니다 :
lazy (f a b c)
이 같이 Lazy.force
을 사용, "적용"합니다. 아마도 lazy
또는 fun() ->
에 대한 편리한 구문이 필요한 경우 해당 목적에 camlp {4,5} 확장자를 사용해야합니다.
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에 제로시 함수가 없음을 지적해야합니다.
'const'의 문제점은'(fun() -> ...)'은 대개 OCaml의 엄격한 평가로 인해'const' 함수가 할 수없는 코드의 평가를 지연시키는 것을 의미합니다. – gasche
@gasche : 지연된 평가에 대한 좋은 지적. 그리고 예, 실수로 SML을 작성하여 수정했습니다. – sepp2k
감사합니다. 내 현재 fun() -> ... '접근 방식을 유지할 것입니다. – Nutel