Haskell: Funktionszusammensetzung hat gerade mein Gehirn beschädigt

7

Wenn

%Vor%

und

%Vor%

Wie funktioniert das?

%Vor%

gegeben:

%Vor%

?

Ich meine, mein Verständnis der Funktionszusammensetzung ist, dass replicate das zurückgeben sollte, was concatMap als Argumente erwartet, damit (.) funktioniert. Aber es sieht nicht so aus. Also, was ist der Haken?

    
artemave 03.08.2012, 21:29
quelle

2 Antworten

19

Es könnte Ihnen helfen zu sehen, was passiert, wenn Sie Klammern zu den Signaturen hinzufügen und sie dann ausrichten:

%Vor%

Jetzt sollte es ziemlich offensichtlich sein, dass die Ausgabe von replicate der Eingabe von concatMap entspricht, wenn wir b und a vereinheitlichen. In diesem Fall ist der Ausgabetyp der Komposition [b] -> [b] .

    
Tom Crockett 03.08.2012, 21:37
quelle
9

Die Schwierigkeit liegt wahrscheinlich in verwirrenden Variablen und wie Sie begründen die Typisierung. Der Trick ist zu prüfen, wie andere haben gesagt, dass (- & gt;) richtig assoziativ ist, was bedeutet, dass du es kannst Richten Sie die Dinge so aus (indem Sie jeweils neue Typvariablen erstellen) Unterschrift, um Verwirrung zu vermeiden):

%Vor%

Dies gibt uns im Wesentlichen einige Einschränkungen, die wir lösen müssen. Nehmen wir an, dass "a ~ b" bedeutet "a ist der gleiche Typ wie b" oder äquivalent "a kann durch b ersetzt werden."

Aus dem Vorstehenden können wir folgende Fakten ableiten:

%Vor%

Aber die zwei Äquivalenzen für b sagen uns das

%Vor%

was dazu führt

%Vor%

Also schreiben wir c wie folgt um:

%Vor%

Die Substitutionen für a und c werden wieder in das Original eingefügt Typ von (.) mit den beiden Funktionen angewendet ergibt

%Vor%

was natürlich in der Form ist, die ghci meldet: Int -> [b] -> [b] .

    
zaphix 03.08.2012 22:19
quelle

Tags und Links