Ich habe Real World Haskell gelesen und nähere mich dem Ende, aber eine Frage des Stils hat mich wegen der (.)
und ($)
-Operatoren belästigt .
Wenn Sie eine Funktion schreiben, die aus anderen Funktionen besteht, schreiben Sie sie wie folgt:
f = g . h
Aber wenn Sie etwas auf das Ende dieser Funktionen anwenden, schreibe ich es so:
k = a $ b $ c $ value
Aber das Buch würde es so schreiben:
k = a . b . c $ value
Für mich sehen sie jetzt funktional gleichwertig aus, sie tun genau das Gleiche in meinen Augen. Je mehr ich jedoch hinschaue, desto mehr sehe ich Menschen, die ihre Funktionen so schreiben, wie es das Buch tut: zuerst komponieren (.)
und dann erst am Ende ($)
einen Wert anhängen, um das Los zu bewerten (niemand macht es mit vielen Dollarkompositionen). .
Gibt es einen Grund für die Verwendung der Bücher, der viel besser ist als die Verwendung aller ($)
Symbole? Oder gibt es hier eine bewährte Methode, die ich nicht bekomme? Oder ist es überflüssig und ich sollte mir überhaupt keine Sorgen machen?
quelle
k = a $ b $ c value
a . b $ c value
, dass ich nicht so sehr mag wie das dritte Beispiel, aber ein paar Zeichen speichere.Antworten:
Ich denke, ich kann dies von der Autorität aus beantworten.
Es gibt keinen besonderen Grund. Bryan und ich ziehen es vor, das Leitungsrauschen zu reduzieren.
.
ist leiser als$
. Infolgedessen verwendet das Buch dief . g . h $ x
Syntax.quelle
f.g.h
eher eine neue clevere Kreation vorstellenf(g(h()))
. Jetzt rufen sie eine neue, wenn auch anonyme Funktion auf, die sie erstellt haben, anstatt nur ein großes Wörterbuch vorgefertigter Funktionsaufrufe wie ein PHP-Benutzer zu verketten.Sie sind in der Tat gleichwertig: Denken Sie daran, dass der
$
Bediener im Wesentlichen nichts tut.f $ x
bewertet zuf x
. Der Zweck von$
ist sein Fixitätsverhalten: rechtsassoziative und minimale Priorität. Wenn Sie$
Klammern für die Gruppierung anstelle der Infix-Priorität entfernen und verwenden, sehen die Code-Snippets folgendermaßen aus:und
Der Grund für den Vorzug der
.
Version gegenüber der$
Version ist der gleiche Grund für den Vorzug beider gegenüber der oben in Klammern gesetzten Version: Ästhetik.Einige mögen sich jedoch fragen, ob die Verwendung von Infix-Operatoren anstelle von Klammern auf einem unbewussten Drang beruht, eine mögliche Ähnlichkeit mit Lisp zu vermeiden (nur ein Scherz ... denke ich?).
quelle
Ich würde , dass in hinzufügen
f . g $ x
,f . g
ist eine sinnvolle syntaktische Einheit.Inzwischen in
f $ g $ x
,f $ g
ist keine sinnvolle Einheit. Eine Kette von$
ist wohl mehr zwingend notwendig - zunächst das Ergebnis erhalten vong
derx
, dann tutf
es, dann tutfoo
es, dann usw.In der Zwischenzeit ist eine Kette von
.
wohl deklarativer und in gewisser Weise näher an einer datenflusszentrierten Ansicht - komponieren Sie eine Reihe von Funktionen und wenden Sie sie letztendlich auf etwas an.quelle
$
Operator scheint sich ähnlich zu verhalten wie der<|
Operator in F #. Ich glaube, beide sind tatsächlich gleich definiert - in F #(<|) a b = a b
und in Haskella $ b = a b
, die im Wesentlichen gleichwertig sind.(<|) b a = a b
in F # ist, da es wie verwendet wird[1; 2; 3; 4; 5] <| List.map ((+) 1)
, wenn Speicher dient.<|
Operator übergibt den Wert an die Funktion, anstatt die Funktion an den Wert zu übergeben. Ihr Codebeispiel würde|>
stattdessen mit dem Operator funktionieren .Für mich ist die Antwort (a) die Ordentlichkeit, wie Don sagte ; und (b) ich stelle fest, dass meine Funktion beim Bearbeiten von Code möglicherweise punktfrei ist, und dann muss ich nur noch den letzten löschen,
$
anstatt zurück zu gehen und alles zu ändern. Ein kleiner Punkt, aber eine nette.quelle
Es gibt eine interessante Diskussion dieser Frage in diesem Hashkell-Cafe-Thread . Offenbar gibt es eine Minderheit Sicht , die besagt , dass das Recht Assoziativität von
$
ist „einfach falsch“ , und wählen Sief . g . h $ x
überf $ g $ h $ x
ist ein Weg , um das Problem Seiten treten.quelle
$!
auch die "einfach falsche" richtige Assoziativität hat - Warum ist das $! Betreiber rechtsassoziativ? .Es ist nur eine Frage des Stils. Die Art und Weise, wie das Buch es macht, macht für mich jedoch mehr Sinn. Es setzt alle Funktionen zusammen und wendet sie dann auf den Wert an.
Ihre Methode sieht einfach seltsam aus und die letzte
$
ist unnötig.Es ist jedoch wirklich egal. In Haskell gibt es normalerweise viele, viele, richtige Wege, um dasselbe zu tun.
quelle
Mir ist klar, dass dies eine sehr alte Frage ist, aber ich denke, es gibt einen anderen Grund dafür, der nicht erwähnt wurde.
Wenn Sie eine neue punktfreie Funktion deklarieren
f . g . h
, wird der übergebene Wert automatisch angewendet. Wenn Sie jedoch schreibenf $ g $ h
, wird es nicht funktionieren.Ich denke, der Grund, warum der Autor die Kompositionsmethode bevorzugt, ist, dass sie zu einer guten Praxis beim Aufbau von Funktionen führt.
quelle