Was ist der Unterschied zwischen dem Punkt (.)
und dem Dollarzeichen ($)
?
Wie ich es sehe, sind sie beide syntaktischer Zucker, um Klammern nicht verwenden zu müssen.
Was ist der Unterschied zwischen dem Punkt (.)
und dem Dollarzeichen ($)
?
Wie ich es sehe, sind sie beide syntaktischer Zucker, um Klammern nicht verwenden zu müssen.
Der wichtigste Teil über $ ist, dass es die niedrigste Operator-Präzedenz hat.
Wenn Sie info eingeben, sehen Sie dies:
> :info ($)
($) :: (a -> b) -> a -> b
-- Definiert in ‘GHC.Base’
infixr 0 $
Dies sagt uns, dass es ein Infix-Operator mit rechts-Assoziativität ist, der die niedrigstmögliche Präzedenz hat. Normale Funktionsanwendung ist links-assoziativ und hat höchste Präzedenz (10). Also ist $ so etwas wie das Gegenteil davon.
Dann verwenden wir es, wo normale Funktionsanwendung oder die Verwendung von () nicht funktioniert.
Also funktioniert zum Beispiel dies:
> head . sort $ "Beispiel"
> e
aber dies funktioniert nicht:
> head . sort "Beispiel"
weil . eine niedrigere Präzedenz als sort hat und der Typ von (sort "Beispiel") [Char] ist.
> :type (sort "Beispiel")
(sort "Beispiel") :: [Char]
Aber . erwartet zwei Funktionen und es gibt keinen schönen kurzen Weg, dies aufgrund der Reihenfolge der Operationen von sort und . zu tun.
Dies beantwortet genau das, was ich zuvor verwirrt habe, deshalb müssen wir den ($) Operator in den Anwendungen einer Funktionskomposition verwenden. Sehr schön, wenn ich diese Seite gründlich durchgesehen hätte, würde ich meine eigene Antwort nicht schreiben, ich denke, meine Antwort ist viel weniger präzise und fehleranfällig als deine. traurig :)
Ja, wir werden eine Funktionskomposition tatsächlich als eine einzelne Funktion betrachten, anstatt den Prozess, den Ausgang einer Funktion als Eingabe einer anderen Funktion zu erhalten, sondern behandeln sie stattdessen als eine "einzige" Funktion, die eine Eingabe entgegennimmt und eine Ausgabe zurückgibt.
Alle anderen Antworten sind ziemlich gut. Aber es gibt ein wichtiges Detail zur Benutzerfreundlichkeit, wie ghc $ behandelt, dass der GHC-Typchecker die Instanzierung mit höheren Rang/quantifizierten Typen ermöglicht. Wenn Sie sich den Typ von $ id
ansehen, werden Sie feststellen, dass es sich um eine Funktion handelt, deren Argument selbst eine polymorphe Funktion ist. Kleinigkeiten wie diese werden mit einem äquivalenten aufgeregten Operator nicht mit derselben Flexibilität behandelt. (Das lässt mich tatsächlich darüber nachdenken, ob $! die gleiche Behandlung verdient oder nicht)
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.