Оператор OCaml |>
Может кто-нибудь объяснить, что делает оператор | > ? Этот код был взят из ссылки здесь:
let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world")
Я вижу, что он делает, но я не знал бы, как применить оператор | > в противном случае.
В этом отношении я понятия не имею, что делает синтаксис Module.(). Объяснение этому тоже было бы неплохо.
Ответы
Ответ 1
Module.(e)
эквивалентен let open Module in e
. Это сокращенный синтаксис, чтобы вводить вещи в область видимости.
Оператор |>
определяется в модуле Pervasives
как let (|>) x f = f x
. (Фактически, он определяется как внешний примитив, проще компилировать. Здесь это неважно). Это обратная прикладная функция, которая упрощает цепочку последовательных вызовов. Без этого вам нужно будет написать
let m = PairsMap.(add (1,0) "world" (add (0,1) "hello" empty))
который требует больше скобок.
Ответ 2
Оператор |>
представляет приложение обратной функции. Это звучит сложно, но это просто означает, что вы можете поместить функцию (и, возможно, несколько дополнительных параметров) после значения, к которому вы хотите применить ее. Это позволяет создавать что-то, что выглядит как конвейер Unix:
# let ( |> ) x f = f x;;
val ( |> ) : 'a -> ('a -> 'b) -> 'b = <fun>
# 0.0 |> sin |> exp;;
- : float = 1.
Обозначение Module.(expr)
используется для временного открытия модуля для одного выражения. Другими словами, вы можете использовать имена из модуля непосредственно в выражении без необходимости префикса имени модуля.
Ответ 3
Оператор |>
выглядит как |
в bash.
Основная идея состоит в том, что
e |> f = f e
Это способ записать ваши приложения в порядке выполнения.
В качестве примера вы можете использовать его (я не особо думаю, что вам следует), чтобы избежать:
12 |> fun x -> e
вместо
let x = 12 in e
Для объекта Module.()
он должен использовать определенную функцию данного модуля.
Вероятно, вы уже видели List.map
.
Конечно, вы можете использовать open List
, а затем ссылаться только на функцию с помощью map
. Но если вы также open Array
впоследствии, map
теперь ссылается на Array.map
, поэтому вам нужно использовать List.map
.