Haskell-Funktion für die Listenlänge

8

Um die Länge einer Liste mit einem foldr zu berechnen, würde man etwas tun wie:

%Vor%

Erweitern Sie weiter die Idee, dass die Faltungsfunktion das zweite Argument inkrementieren muss, ich kam auf dieses Problem (und es ist falsch):

%Vor%

Eine weitere Überprüfung des Typs zeigt dies:

%Vor%

Haskell-Funktion höherer Ordnung zur Berechnung der Länge Es gibt einen interessanten Kommentar auf dieser Seite, den ich wirklich nicht verstehen kann

%Vor%

Kann jemand erklären, wie diese Komposition tatsächlich funktioniert?

    
sa___ 02.01.2016, 09:25
quelle

2 Antworten

7

Konzentrieren wir uns zuerst, warum foldr ((+1) . (flip const)) 0 falsch ist. Sie möchten nur das zweite Argument erhöhen und das erste Argument vergessen. Semantisch ist das

%Vor%

Sie haben jedoch Folgendes geschrieben:

%Vor%

Aus diesem Grund benötigen Sie plötzlich Num (c -> c) , da Sie (+1) auf id anwenden möchten.

Aber du meinst eigentlich:

%Vor%

Schließlich wollen Sie das erste Argument vergessen und eine Funktion f auf der zweiten verwenden. Alles, was Sie tun müssen, ist const f zu verwenden.

Die Komposition ((+1).).(flip const) ist zu ausführlich und wahrscheinlich von pointfree generiert:

%Vor%     
Zeta 02.01.2016, 10:34
quelle
3

Das ist wirklich ein Kommentar, aber viel zu lang für einen.

Wenn Sie nicht mit seltsamen Zahlen wie faul Nat s zu tun haben, wollen Sie wirklich

%Vor%

Machen Sie das sinnlos,

%Vor%

Wenn Sie möchten, können Sie den ursprünglichen foldl' Ausdruck in ein foldr Formular wie folgt umwandeln:

%Vor%

Kauen auf go ,

%Vor%

Kauen auf length ,

%Vor%

Alles zusammenfügen,

%Vor%

Ich finde diese punktfreie Form ganz und gar undurchsichtig.

    
dfeuer 02.01.2016 17:28
quelle

Tags und Links