减法运算符的最干净的部分应用

cleanest partial application of subtraction operator

如果我想要一个从数字 2 中减去 int 参数的函数,我可以这样做

let two_minus = (-) 2

但是,如果我想要一个从 一个 int 参数中减去 2 的函数怎么办?

在Haskell,我能做到

let minus2 = flip (-) 2

但是在 Ocaml 4.02 中,flip 不是标准库的一部分。

现在,我决定

let minus2 = (+) ~-2

将负数 2 添加到 int 参数。我发现它看起来比

let minus2 = fun x -> x-2

...或者至少它需要更少的字符。

是否有更好、更惯用的方法?

OCaml 是一种编程语言。您可以自由定义您觉得方便的任何内容:

let flip f x y = f y x

在 Haskell 中,您可以使用运算符部分做任何您想做的事情,这比 flip imo:

干净得多
Prelude> :t (2 -)
(2 -) :: Num a => a -> a
Prelude> :t ((-) 2)
((-) 2) :: Num a => a -> a

OCaml 不支持这种精确性 (afaik)。但是,如果您喜欢flip,定义您自己的是微不足道的:

let flip f x y = f y x;;

或者您可以使用已经定义的标准库,例如 CoreBatteries。例如,

# open Core 
utop # Fn.flip;;
- : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c = <fun>

fwiw,在没有运算符部分的情况下,我发现 fun x -> x-2 比您提出的两个备选方案中的任何一个都清晰得多。它可能看起来不太好,但它的含义一目了然。

OCaml 非常地道,非常 更喜欢清晰和 明确的表达方式,而不是聪明简洁的表达方式。