在OCaml中更改应用程序顺序

7

除了括号之外,有没有一种方法可以将左结合的顺序更改为右结合的顺序?例如,在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

2个回答

6
当然,您可以自己定义它:
let (@@@) f x = f x

然后,a @@@ b 3 的值为20。请确保选择一个右结合的起始符号(参见此处)($... 是左结合的)。

1
你可以像 Haskell 一样定义一个 '$' 操作符:let ($) f x = f x ;; - aneccodeal
1
不,实际上你不能使用“$”符号。它对于这个基本的例子可以工作,但是如果你尝试 f $ g $ h x 就不行了。 - Fabrice Le Fessant

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 *)

为什么不使用更短的@@而是用@@@?它已经在标准库中使用了吗? - Ricardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接