除了括号之外,有没有一种方法可以将左结合的顺序更改为右结合的顺序?例如,在Haskell中,您可以编写foo $ bar b
,并且foo
将应用于bar b
的结果。
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
的结果。
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"
print_int (3 |> g |> f);;
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 *)
f $ g $ h x
就不行了。 - Fabrice Le Fessant