在OCaml中更改应用程序顺序

在OCaml中更改应用程序顺序,ocaml,Ocaml,有没有办法将顺序从左关联更改为右关联(括号除外)?例如,在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 然后,a@@@b3计算为20。确保选择右关联的起始符号()($…是左关联的)您只需为此类应用程序定义一个符号: let (@@@)

有没有办法将顺序从左关联更改为右关联(括号除外)?例如,在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

然后,
a@@@b3
计算为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 *)

您可以像Haskell中那样定义一个“$”操作符:let($)fx=fx;;不,实际上,您不能使用“$”。它适用于这个基本示例,但如果您尝试
f$g$hx
为什么不使用较短的@@@@?它已经在标准库中使用了吗?