Ich habe mich in der Vergangenheit mit Haskell herumgetrieben und bin erst kürzlich wieder ernsthaft dazu gekommen, und ich lese echte Haskell. Einige der Beispiele, die sie geglänzt haben, muss ich noch verstehen. Solch ein:Kann mir jemand diese Haskell-Funktionen erklären?
myLength [] = 0
myLength (x:xs) = 1 + myLength (xs)
Ich sehe nicht, wie das funktioniert, was 1 ist auch wirklich hinzugefügt? Wie gibt die Rekursion etwas zurück, das hinzugefügt werden kann? Ich verstehe es nicht.
Und hier haben wir diese:
splitLines [] = []
splitLines cs =
let (pre, suf) = break isLineTerminator cs
in pre : case suf of
('\r':'\n':rest) -> splitLines rest
('\r':rest) -> splitLines rest
('\n':rest) -> splitLines rest
_ -> []
isLineTerminator c = c == '\r' || c == '\n'
Wie funktioniert das, was wirklich zu sehr an vorbestellt werden? Ich sehe nicht, wie das Ergebnis des Fallausdrucks etwas ist, mit dem man sich verketten kann. Vielleicht brauche ich nur jemanden, der die Auswertung dieser Funktionen im Detail erklärt. Ich muss etwas sehr Wichtiges vermissen.
Vielen Dank im Voraus!
EDIT: Ich weiß, es war ein Kopieren-Einfügen fehlgeschlagen. Es tut uns leid.
EDIT 2: Es scheint, dass meine Verwirrung war mit dem, was diese Funktionen tatsächlich waren/zurückgeben/Ich habe alles jetzt ausgearbeitet. Danke für die Antworten Jungs, es hat endlich geklickt! Ich schätze es!
Ich verstehe, wie das funktioniert, aber jetzt bin ich verloren, warum das funktioniert. Das Ergebnis ist entweder ein anderer rekursiver Aufruf oder eine leere Liste. Im Wesentlichen sieht es so aus, als würde Pre mit jedem Rezidiv verkettet werden, aber der Case-Ausdruck kehrt nicht vor. Verwirrend. – Rayne
Eigentlich nach dem Lesen wieder, es sieht aus wie pre wird mit dem Argument zu splitLines, nicht das Ergebnis verkettet. Ich bin mir nur nicht sicher, wie dies mehr als einen rekursiven Aufruf zurückgibt, der schließlich [] zurückgeben wird. Ich glaube, ich verstehe die Rekursion nicht so sehr wie ich dachte: \ – Rayne
Wenn ich mir die Funktion anschaue, sieht der case-Ausdruck so aus, als würde er das Ergebnis eines rekursiven Aufrufs zurückgeben, der das Ergebnis eines rekursiven Aufrufs ist eines rekursiven Aufrufs und so weiter, bis es [] zurückgibt. Ich sehe nicht, wie Ruhe in dieser Situation verkettet wird. – Rayne