Ich versuche, etwas über mich selbst über Operator und Funktion Vorrang in Haskell zu verifizieren. Zum Beispiel der folgende CodeHaskell Operator vs Funktion Vorrang
list = map foo $ xs
als
list = (map foo) $ (xs)
neu geschrieben werden und wird schließlich sein
list = map foo xs
Meine Frage früher, warum die erste Formulierung nicht so neu geschrieben werden würde
list = (map foo $) xs
da die Funktionspriorität immer höher ist als die Operatorpriorität, aber ich denke, dass ich die Antwort gefunden habe: Operatoren dürfen einfach keine Argumente von Funktionen sein (außer natürlich, wenn man sie mit Klammern umgibt). Ist das richtig? Wenn dem so ist, finde ich es merkwürdig, dass es in RWH oder Learn you a Haskell oder irgendeinen anderen Ort, an dem ich gesucht habe, keine Erwähnung dieser Mechanik/Regel gibt. Wenn du also einen Ort kennst, an dem die Regel steht, verlinke bitte darauf.
- bearbeiten: Vielen Dank für Ihre schnellen Antworten. Ich glaube, meine Verwirrung kam dadurch, dass ich dachte, dass ein Operator-Literal irgendwie etwas auswerten würde, das von einer Funktion als Argument konsumiert werden könnte. Es half mir, mich daran zu erinnern, dass ein Infix-Operator mechanisch in eine Präfix-Funktion übersetzt werden kann. Dies trägt zur ersten Formulierung Ausbeuten
($) (map foo) (xs)
wo es kein Zweifel daran, dass ($) ist die verzehrende Funktion, und da die beiden Formulierungen äquivalent sind, dann ist der $ wörtliche in der ersten Formulierung kann nicht auf der Karte verbraucht werden.
Vielen Dank. Nach dem Lesen Ihrer Antwort, wenn Sie sagen, dass meine Frage ein wenig verwirrt ist, nehme ich es zu verstehen, dass meine Erwähnung der "Funktionspräzedenz" falsch ist, und dass Funktionen an sich keinen Vorrang haben, sondern eher als gedacht werden können Argumente für den Anwendungsoperator whitespace. Ist das richtig? Mir ist noch nicht ganz klar, wie Infix-Operatoren dazu passen. Ich habe meine Frage bearbeitet, um zu reflektieren, wie ich am besten darüber nachdenken kann. Ist dieses Verständnis korrekt? – Boris
Nein, nicht ganz. Funktionen und Operatoren sind in Haskell nicht zu unterscheiden. Sie können beide unterschiedliche Prioritätsstufen haben, die vom Benutzer festgelegt werden. –
Ok. Ich versuche immer noch, die allgemeine Regel herauszufinden, die zu list = (map foo) $ (xs) statt list = (map foo $) xs führt - was ich weiß, ist ein Abschnitt. Kann man sagen, dass bei der Entscheidung, welche Argumente zu welchen Funktionen und Operatoren gehören, Funktionen - beginnend von links - alle möglichen Argumente konsumieren, bis sie einen Operator erreichen.Danach konsumieren die Operatoren ihre Argumente entsprechend ihrer Präzedenz und Assoziativität (Das ist irgendwie vage, aber ich hoffe, Sie verstehen es). Tut mir leid, wenn das offensichtlich scheint, aber es war mir nie wirklich klar. – Boris