2010-11-22 36 views
7

Có cách nào để thay đổi thứ tự từ kết hợp trái sang phải liên kết, ngoại trừ dấu ngoặc đơn không? Ví dụ: trong Haskell, bạn có thể viết foo $ bar bfoo sẽ được áp dụng cho kết quả từ bar b.Thay đổi thứ tự ứng dụng trong OCaml

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

let c = a ??? b 3;; 

print_int c;; 

nên in 20

Trả lời

6

Chắc chắn, bạn có thể định nghĩa nó tự hỏi:

let (@@@) f x = f x 

Sau đó, a @@@ b 3 đánh giá đến 20. Hãy chắc chắn để chọn một biểu tượng khởi đầu như vậy mà nó là phải kết hợp (see here) ($... là liên kết trái)

+1

Bạn chỉ có thể xác định một nhà điều hành '$' như trong Haskell: hãy ($) fx = fx ;; – aneccodeal

+1

Không, thực sự, bạn không thể sử dụng '$'. Nó hoạt động cho ví dụ cơ bản này, nhưng không phải nếu bạn thử 'f $ g $ h x' –

4

Bạn chỉ cần xác định biểu tượng cho các ứng dụng như vậy:

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

Và sau đó

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

không in 20.

Lưu ý rằng phiên bản tiếp theo của OCaml (3.13 hay 4.00) sẽ cung cấp nguyên thủy được xây dựng trong các ứng dụng mà tránh tạo ra các chức năng áp dụng một phần trung gian:

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

Điều cuối cùng đối diện với %apply :

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

Lưu ý rằng bạn không thể sử dụng ($) vì nó là trái kết hợp trong định nghĩa của bộ phân tích OCaml:

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

Tại sao không ngắn hơn @@ thay vì @@@? Nó được sử dụng trong thư viện chuẩn chưa? – Ricardo

Các vấn đề liên quan