2010-12-18 13 views

Odpowiedz

10

Jak o:

lazy (f a b c) 

do "zastosowania", użyj Lazy.force, jak w:

# let l = lazy (2+2) ;; 
val l : int lazy_t = <lazy> 
# Lazy.force l ;; 
- : int = 4 

Znaczenie nie jest dokładnie taka sama jak (fun() -> ...) i ...() i to naprawdę nie jest krótsza. Być może, jeśli naprawdę potrzebujesz wygodnej składni dla lazy lub fun() -> powinieneś użyć rozszerzenia camlp {4,5} do tego celu.

6

Jeśli f zostały zdefiniowane jako f a b c() = ..., można po prostu zrobić a (f a b c), ale poza tym nie, nie ma krótszy sposób.

Jeśli chcesz można zdefiniować funkcję const tak:

let const x _ = x 

a następnie używać go tak:

a (const (f a b c)) 

Ale to naprawdę nie jest dużo krótszy (lub jaśniejsze) niż przy użyciu fun. Również natychmiast ocenia f a b c, co prawdopodobnie nie jest tym, czego chcesz.

PS: Pedant we mnie musi zaznaczyć, że (fun() -> ...) jest funkcją jednoargumentową i nie ma funkcji zero-arity w ocaml.

+2

Problem z 'const' polega na tym, że' (fun() -> ...) 'zwykle ma na celu opóźnienie oceny kodu, którego funkcja' const', ze względu na ścisłą ocenę OCaml, nie może zrobić. – gasche

+0

@gasche: Dobrze, o opóźnionej ocenie. I tak, przypadkowo napisałem SML, naprawiłem to. – sepp2k

+0

Dzięki, myślę, że pozostanę przy mojej obecnej zabawie() -> ... – Nutel