2010-11-22 40 views
7

是否有方法將順序從左關聯改爲右關聯(括號除外)?例如在Haskell中,您可以編寫foo $ bar bfoo將應用於bar b的結果。更改OCaml中的申請順序

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

let c = a ??? b 3;; 

print_int c;; 

應打印20

回答

6

當然,你可以自己定義:

let (@@@) f x = f x 

然後,a @@@ b 3計算結果爲20務必選擇開始符號,使得其右關聯(see here)($...是左關聯的)

+1

你可以只定義了一個「$」操作就像在哈斯克爾:讓($)fx = fx ;; – aneccodeal 2010-11-23 15:05:33

+1

不,實際上,您不能使用'$'。它適用於這個基本的例子,但不是如果你嘗試'f $ g $ h x' – 2012-02-19 16:53:57

4

您只需爲這些應用程序定義符號:

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

然後

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

確實打印20.

注意OCaml的的下一個版本(3.13或4.00)將對於避免創建中間部分應用功能的應用程序提供內置原語:

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

最後一個是與%apply相反:

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

請注意,您不能使用($),因爲它是左結合在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

爲什麼不是較短的@@而不是@@@?它已經在標準庫中使用了嗎? – Ricardo 2012-03-22 12:46:57