减法算子最干净的部分应用

时间:2018-12-30 22:53:13

标签: ocaml subtraction partial-application

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

let two_minus = (-) 2

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

在Haskell,我可以做

let minus2 = flip (-) 2

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

目前,我已经解决

let minus2 = (+) ~-2

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

let minus2 = fun x -> x-2

...或者至少需要较少的字符。

有没有更好,更惯用的方式?

2 个答案:

答案 0 :(得分:3)

在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>

首先,在没有运算符部分的情况下,我发现fun x -> x-2比您提出的两种选择中的任何一种都更清楚。它可能看起来不太好,但是可以立即看出它的含义。

在聪明和简洁的表达式上偏爱清晰和非常的表达式是非常习惯的OCaml。

答案 1 :(得分:1)

OCaml是一种编程语言。您可以随意定义任何您认为方便的内容:

let flip f x y = f y x