Короткий путь прохождения лямбда-функции с нулевой арностью в OCaml - PullRequest
6 голосов
/ 18 декабря 2010

Есть ли какой-нибудь короткий способ передать функцию с нулевой арностью в другую функцию. Сейчас я делаю это так:

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

Есть ли синтаксический сахар для второй строки?

Ответы [ 2 ]

10 голосов
/ 19 декабря 2010

Как насчет:

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} для этой цели.

6 голосов
/ 18 декабря 2010

Если 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...