Изменить порядок приложения в OCaml - PullRequest
7 голосов
/ 22 ноября 2010

Есть ли способ изменить порядок с левой ассоциативной на правую ассоциативную, кроме скобок?Например, в 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 голосов
/ 22 ноября 2010

Конечно, вы можете определить это самостоятельно:

let (@@@) f x = f x

Затем a @@@ b 3 оценивается до 20. Убедитесь, что вы выбрали начальный символ, так что он ассоциирован справа ( см. Здесь ) ($... является левоассоциативным)

4 голосов
/ 19 февраля 2012

Вы просто должны определить символ для таких приложений:

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 *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...