是否有方法將順序從左關聯改爲右關聯(括號除外)?例如在Haskell中,您可以編寫foo $ bar b
,foo
將應用於bar b
的結果。更改OCaml中的申請順序
let a x = x * 4;;
let b y = y + 2;;
let c = a ??? b 3;;
print_int c;;
應打印20
是否有方法將順序從左關聯改爲右關聯(括號除外)?例如在Haskell中,您可以編寫foo $ bar b
,foo
將應用於bar b
的結果。更改OCaml中的申請順序
let a x = x * 4;;
let b y = y + 2;;
let c = a ??? b 3;;
print_int c;;
應打印20
您只需爲這些應用程序定義符號:
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 *)
爲什麼不是較短的@@而不是@@@?它已經在標準庫中使用了嗎? – Ricardo 2012-03-22 12:46:57
你可以只定義了一個「$」操作就像在哈斯克爾:讓($)fx = fx ;; – aneccodeal 2010-11-23 15:05:33
不,實際上,您不能使用'$'。它適用於這個基本的例子,但不是如果你嘗試'f $ g $ h x' – 2012-02-19 16:53:57