Was eigentlich $ Funktion in Haskell tut? [Duplikat]

8

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?

    
Znatz 03.04.2013, 10:25
quelle

3 Antworten

15

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:

%Vor%

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:

%Vor%

Jetzt überraschen wir bis jetzt, wir haben \f -> f $ [1,2,3,4] . Wir können auch schreiben

%Vor%

, um die Funktion \l -> length $ l zu erhalten. Aber wie wäre es damit:

%Vor%

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:

%Vor%

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:

%Vor%

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.

    
Andrej Bauer 03.04.2013, 10:42
quelle
10

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).

    
Scott Olson 03.04.2013 10:30
quelle
6

($ [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 Ссылка

an     
drquicksilver 03.04.2013 10:30
quelle