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?
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
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:
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
Machen Sie das sinnlos,
%Vor% Wenn Sie möchten, können Sie den ursprünglichen foldl'
Ausdruck in ein foldr
Formular wie folgt umwandeln:
Kauen auf go
,
Kauen auf length
,
Alles zusammenfügen,
%Vor%Ich finde diese punktfreie Form ganz und gar undurchsichtig.