2015-05-27 18 views
10

Könnte jemand erklären, was der |> Operator tut? Dieser Code wurde von der Referenz genommen here:OCaml |> operator

let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world") 

Ich kann sehen, was es tut, aber ich würde nicht wissen, wie das anwenden |> Betreiber anders.

Zu diesem Thema habe ich keine Ahnung, was die Modul.() Syntax tut. Eine Erklärung dazu wäre auch schön.

Antwort

15

Module.(e) entspricht let open Module in e. Es ist eine Kurzschriftsyntax, um Dinge in den Geltungsbereich einzubringen. Der Operator |> ist im Modul Pervasives als let (|>) x f = f x definiert. (In der Tat ist es als ein externes Primitiv definiert, leichter zu kompilieren. Dies ist hier unwichtig.) Es ist die umgekehrte Anwendung Funktion, die es erleichtert, aufeinanderfolgende Anrufe zu ketten. Ohne es würden Sie schreiben müssen

let m = PairsMap.(add (1,0) "world" (add (0,1) "hello" empty)) 

, die mehr Klammern benötigt.

3

Der Operator |> steht für umgekehrte Funktion. Es klingt kompliziert, aber es bedeutet nur, Sie können die Funktion (und vielleicht ein paar zusätzliche Parameter) nach den Wert, den Sie es anwenden möchten. Auf diese Weise können Sie etwas aufbauen, das wie eine Unix-Pipeline aussieht:

# let (|>) x f = f x;; 
val (|>) : 'a -> ('a -> 'b) -> 'b = <fun> 
# 0.0 |> sin |> exp;; 
- : float = 1. 

Die Notation Module.(expr) verwendet wird, um das Modul zu öffnen vorübergehend für einen Ausdruck. Mit anderen Worten, Sie können Namen aus dem Modul direkt im Ausdruck verwenden, ohne den Modulnamen voranstellen zu müssen.

3

Der Operator |> sieht aus wie die | in bash.

Die Grundidee ist, dass

e |> f = f e 

Es ist ein Weg, um Ihre Anwendungen in der Reihenfolge der Ausführung zu schreiben.

Als exemple Sie es verwenden könnte (ich glaube nicht, vor allem sollten Sie aber) vermeiden lässt:

12 |> fun x -> e 

statt

let x = 12 in e 

Für die Module.() Sache, Es ist eine bestimmte Funktion eines bestimmten Moduls zu verwenden.

Sie haben wahrscheinlich schon List.map gesehen. Sie könnten natürlich open List verwenden und dann nur auf die Funktion mit map verweisen. Aber wenn Sie auch open Array danach, map bezieht sich jetzt auf Array.map, so müssen Sie List.map verwenden.