2010-11-22 19 views
7

Parantezler hariç, siparişi sol çağrıştırıcıdan sağa ilişkilendiriciye dönüştürmenin bir yolu var mı? Örneğin Haskell'de foo $ bar b yazıp foobar b sonucuna uygulanacaktır.Uygulama sırasını değiştirin OCaml

let a x = x * 4;; 
let b y = y + 2;; 

let c = a ??? b 3;; 

print_int c;; 

cevap

6

Emin baskı olursa, bunu kendiniz tanımlayabilirsiniz:

let (@@@) f x = f x 

Sonra a @@@ b 3 20'ye olarak değerlendirilen bir başlangıç ​​sembol seçmek için emin olun o sağ ilişkisel olacak şekilde (see here) ($... bağımlı-bırakklamalı)

+1

Sadece Haskell gibi bir '$' operatörünü tanımlayabiliriz:: o OCaml ayrıştırıcı tanımında sola birleşim olduğu gibi

print_int (3 |> g |> f);; 

Not ($) kullanamazsınız let ($) fx = fx ;; – aneccodeal

+1

Hayır, aslında, '$' kullanamazsınız. Bu temel örnek için çalışır, ancak eğer f $ g $ h x ' –

4

Sadece böyle uygulamalar için bir sembol tanımlamanız gerekiyor:

let (@@@) f x = f x ;; 

Sonra

let f x = x * 4;; 
let g y = y + 2;; 
let a = f @@@ g 3;; 
print_int a;; 

baskısını OCaml bir sonraki versiyon (3.13 veya 4.00) ara maddesi, kısmen uygulanan fonksiyonları oluşmasını önlemek uygulamalar için yerleşik ilkellerini sağlayacak 20.

Not yapar:

external (@@@) : ('a -> 'b) -> 'a -> 'b = "%apply" 
external (|>) : 'a -> ('a -> 'b) -> 'b = "%revapply" 

Sonuncusu, %apply'un tam tersidir.

let ($) f x = f x ;; 
let a = f $ g 3;;  (* ok ! ??? *) 
let a = f $ g $ g 3;; (* ERROR -> g is not an integer, 
         because OCaml computes (f $ g) first *) 
+0

denerseniz, neden @@ yerine @@@ daha kısa değil? Standart kütüphanede zaten kullanılıyor mu? – Ricardo