Konvertieren von F # -Pipeline-Operatoren (|,,) nach OCaml

7

Ich konvertiere etwas F # -Code in OCaml und sehe viele Verwendungen dieses Pipelineoperators <| , zum Beispiel:

%Vor%

Der <| -Operator ist scheinbar nur definiert:

%Vor%

Ich wundere mich, warum sie sich bemühen, diesen Operator in F # zu definieren und zu verwenden, ist es nur so, dass sie es vermeiden können, Parens so zu setzen?:

%Vor%

Soweit ich das beurteilen kann, wäre das die Umwandlung des obigen F # -Codes in OCaml, richtig?

Wie würde ich auch F # 's << und >> Operatoren in Ocaml implementieren?

(der |> -Operator scheint einfach zu sein: let ( |> ) a b = b a ;; )

    
aneccodeal 19.01.2013, 03:56
quelle

4 Antworten

11

Direkt von der F # -Quelle :

%Vor%     
ildjarn 19.01.2013, 04:15
quelle
14
  

warum sie sich bemühen, diesen Operator in F # zu definieren und zu verwenden, ist es nur so, dass sie Parens vermeiden können?

Es liegt daran, dass der funktionale Weg des Programmierens das Einfädeln eines Wertes durch eine Kette von Funktionen voraussetzt. Vergleichen Sie:

%Vor%

Im ersten Ausschnitt sehen wir deutlich, was mit dem Wert passiert. Wenn wir den zweiten lesen, müssen wir alle Parens durchgehen, um herauszufinden, was vor sich geht.

Dieser Artikel über die Zusammensetzung der Funktionen scheint relevant zu sein .

Also, in einem normalen Leben geht es hauptsächlich um Parens. Aber auch Pipelinebetreiber stehen in engem Zusammenhang mit der Anwendung von Teilfunktionen und dem punktfreien Codierungsstil. Weitere Informationen finden Sie unter Programmierung ist "sinnlos" .

Die Operatoren pipeline |> und function composition >> << können einen weiteren interessanten Effekt erzeugen, wenn sie an Funktionen auf höherer Ebene übergeben werden, wie zB hier .

    
bytebuster 19.01.2013 06:03
quelle
9

OCaml Batteries unterstützt diese Operatoren, aber aus Gründen der Priorität, Assoziativität und anderen syntaktischen Macken (wie Camlp4) verwendet es verschiedene Symbole. Welche speziellen Symbole gerade verwendet wurden, gibt es einige Änderungen. Siehe: Battery API :

%Vor%

Funktionsanwendung. x | & gt; f ist äquivalent zu f x.

%Vor%

Funktionsanwendung. f ** & gt; x ist gleichbedeutend mit f x. Hinweis Der Name dieses Operators ist nicht in Stein geschrieben. Es wird sich bald ändern.

%Vor%

Funktionszusammensetzung. f | - g ist Spaß x - & gt; g (fx). Dies entspricht auch der doppelten Verwendung von & lt; **.

%Vor%

Funktionszusammensetzung. f - | g ist Spaß x - & gt; f (gx). Mathematisch ist dies Operator o.

Aber Batterien Stamm bietet:

%Vor%

Funktionsanwendung. [f @@ x] entspricht [f x].

%Vor%

Funktionszusammensetzung: der mathematische [o] Operator.

%Vor%

Die Anwendung "pipe": function. [x | & gt; f] entspricht [f x].

%Vor%

Rohrleitungsfunktionszusammensetzung [f% & gt; g] ist [Spaß x - & gt; g (f x)].

    
lukstafi 19.01.2013 12:21
quelle
6
  

Ich frage mich, warum sie sich bemühen, diesen Operator in F # zu definieren und zu verwenden, ist es nur so, dass sie es vermeiden können, Parens so zu setzen?

Ausgezeichnete Frage. Der spezifische Operator, auf den du beziehst ( <| ), ist ein ziemlich nutzloser IME. Dadurch können Sie in seltenen Fällen Klammern vermeiden, aber im Allgemeinen wird die Syntax komplizierter, da mehr Operatoren eingezogen werden und es für weniger erfahrene F # -Programmierer (von denen es jetzt viele gibt) schwieriger wird, Ihren Code zu verstehen. Also habe ich aufgehört, es zu benutzen.

Der Operator |> ist viel nützlicher, aber nur, weil er F # hilft, in Situationen, in denen OCaml kein Problem haben würde, Typen richtig abzuleiten. Zum Beispiel ist hier ein OCaml:

%Vor%

Das direkte Äquivalent schlägt in F # fehl, da der Typ von o vor dem Lesen der Eigenschaft foo nicht abgeleitet werden kann. Die idiomatische Lösung besteht also darin, den Code mit |> neu zu schreiben, damit F # den Typ von o vor foo wird verwendet:

%Vor%

Ich benutze selten die anderen Operatoren ( << und >> ), weil sie auch die Syntax komplizieren. Ich mag auch keine Parser-Kombinator-Bibliotheken, die viele Operatoren verwenden.

Das Beispiel, das Bytebuster gab, ist interessant:

%Vor%

Ich würde dies als schreiben:

%Vor%

In meinem Code gibt es keine Klammern. Meine Provisorien haben Namen, so dass sie im Debugger erscheinen, und ich kann sie untersuchen, und Intellisense kann mir eine Art Rückmeldung geben, wenn ich die Maus über sie halte. Diese Eigenschaften sind wertvoll für Produktionscode, den nicht-Experten F # -Programmierer beibehalten werden.

    
Jon Harrop 20.01.2013 12:06
quelle

Tags und Links