чистейшее частичное применение оператора вычитания - PullRequest
0 голосов
/ 31 декабря 2018

Если мне нужна функция, которая вычитает аргумент int из числа 2, я могу сделать

let two_minus = (-) 2

Но что, если я хочу функцию, которая вычитает 2 из иаргумент int?

В Haskell я могу сделать

let minus2 = flip (-) 2

Но в Ocaml 4.02 flip не является частью стандартной библиотеки.

Пока что яостановились на

let minus2 = (+) ~-2

, который добавляет отрицательный 2 к аргументу int.Я считаю, что он выглядит чище, чем

let minus2 = fun x -> x-2

... или, по крайней мере, требует меньше символов.

Есть ли лучший, более идиоматический способ?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

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

Между прочим, в отсутствие операторных секций я нахожу fun x -> x-2 намного более ясным, чем любая из двух предложенных вами альтернатив.Может показаться, что это не очень хорошо, но сразу понятно, что это значит.

Любить ясные и очень явные выражения над умными и краткими выражениями - очень идиоматичный OCaml.

0 голосов
/ 31 декабря 2018

OCaml - это язык программирования.Вы можете сами определять, что вам удобно:

let flip f x y = f y x
...