减法运算符的最干净的部分应用
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;;
或者您可以使用已经定义的标准库,例如 Core
和 Batteries
。例如,
# open Core
utop # Fn.flip;;
- : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c = <fun>
fwiw,在没有运算符部分的情况下,我发现 fun x -> x-2
比您提出的两个备选方案中的任何一个都清晰得多。它可能看起来不太好,但它的含义一目了然。
OCaml 非常地道,非常 更喜欢清晰和 明确的表达方式,而不是聪明简洁的表达方式。
如果我想要一个从数字 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;;
或者您可以使用已经定义的标准库,例如 Core
和 Batteries
。例如,
# open Core
utop # Fn.flip;;
- : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c = <fun>
fwiw,在没有运算符部分的情况下,我发现 fun x -> x-2
比您提出的两个备选方案中的任何一个都清晰得多。它可能看起来不太好,但它的含义一目了然。
OCaml 非常地道,非常 更喜欢清晰和 明确的表达方式,而不是聪明简洁的表达方式。