Ich weiß
%Vor%Intuitiv scheint es mir, möchte ich sagen, 1. $ verzögert die Auswertung der Funktion nach links 2. wertet was zu seinem Recht aus 3. füttert das Ergebnis seiner linken Seite nach rechts.
Und es macht vollkommen Sinn für mich, wenn
%Vor%Was ich nicht verstehe, ist warum,
%Vor%Nach dem Typ von $ zu urteilen, ist es nicht so, dass sein (erstes) Argument eine Funktion sein sollte?
Das hat mit dem Parsen zu tun. In Haskell können Sie (op arg)
schreiben, wobei op
ein Infix-Operator ist. Dies ist nicht dasselbe wie ((op) arg)
. Und du kannst auch (arg op)
schreiben! Zum Beispiel:
Das heißt, (+ 4)
ist die Funktion \x -> x + 4
und (4 +)
ist die Funktion \y -> 4 + y
. Im Falle der Addition sind das gleiche Funktionen, aber das ist im Moment nicht wirklich wichtig.
Nun wollen wir den gleichen Trick an $
ausprobieren:
Jetzt überraschen wir bis jetzt, wir haben \f -> f $ [1,2,3,4]
. Wir können auch schreiben
, um die Funktion \l -> length $ l
zu erhalten. Aber wie wäre es damit:
Das ist seltsam, aber es macht Sinn! Wir haben \f -> f $ length
, d. H. Ein funktionelles , das eine Funktion f
vom Typ ([a] -> Int) -> b)
erwartet, die auf length
angewendet wird. Es gibt eine vierte Möglichkeit:
Alles ist so, wie es sein sollte, denn [1,2,3,4]
ist keine Funktion. Was ist, wenn wir $
in Klammern schreiben? Dann verschwindet seine spezielle Bedeutung als Infix-Operator:
Also, um Ihre Frage zu beantworten: $ [1,2,3,4]
wird als \f -> f $ [1,2,3,4]
analysiert, daher ist es sehr sinnvoll, sie auf length
anzuwenden. % Co_de% macht jedoch wenig Sinn, da ($) [1, 2, 3, 4]
nicht als Infixoperator angesehen wird.
Übrigens macht ($)
sozusagen "nichts". Es wird hauptsächlich für lesbarere Eingaben verwendet, da es eine niedrige Priorität hat und wir daher $
anstelle von f $ g $ h $ x
schreiben können.
Ihre Frage dreht sich wirklich um sogenannte Operatorsektionen. Mit jedem Operator in Haskell (ich werde +
als Beispiel verwenden) können Sie etwas wie (+ arg)
oder (arg +)
schreiben. Dies sind nur Kurzschriftsyntax für die anonymen Funktionen (\x -> x + arg)
bzw. (\x -> arg + x)
.
Also bedeutet die ($ [1..5])
-Syntax nur (\x -> x $ [1..5])
, was dasselbe ist wie (\x -> x [1..5])
(dh eine Funktion, die [1..5]
an die als Argument übergebene Funktion übergibt).
($ [1..5])
ist ein Abschnitt. Das ist ein teilweise angewandter Operator. Es ist eine Abkürzung für (\f -> f $ [1..5])
.
In Sektionen können Sie einem binären Operator ein Argument übergeben und eine Funktion erzeugen - eine Funktion, die auf das verbleibende Argument wartet.
Sehen Sie sich Ссылка
anTags und Links haskell syntax operators dollar-sign haskell-prelude