在OCaml中更改应用程序顺序
有没有办法将顺序从左关联更改为右关联(括号除外)?例如,在Haskell中,您可以编写在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 (@@@)
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
为什么不使用较短的@@@@?它已经在标准库中使用了吗?