Zuerst den folgenden Code prüfen, die die Anzahl der Leerzeichen in einem String zählt:mit Liste Patterns Vergleich
countSpaces :: String -> Int
countSpaces [] = 0
countSpaces (c : restOfString)
= d + countSpaces restOfString
where d = if c == ’ ’ then 1
else 0
Hier ist meine Fragen:
1, wenn ich einen Anruf zu tätigen: countSpaces "abc"
, Was passiert dann, wenn diese Funktion versucht, die Zeichenfolge "abc"
mit (c: restOfString)
zu verknüpfen. Ich meine, restOfString
ist: "abc"
in diesem Anruf aber was ist (c:restOfString)
? Sie "consing" etwas (die Variable? c
) zu restOfstring
und dann versuchen Sie zu entsprechen? Ich verstehe es einfach nicht.
2, ich versuche, den Code auszuführen, aber ich bekomme einen Parse-Fehler warum?
Parse-Fehler bei der Eingabe ‚'‘
3, wird dieser Funktionsaufruf countSpaces
ins Unendliche? seit restOfString
ist immer gleich und nicht reduziert, z. Der Anruf countSpaces "aaa"
wird nicht nach dem ersten Anruf, zweite oder einen Anruf ändern, nicht wahr?
- hinzugefügt danach *
nun diesen Code betrachten, die die gleiche Aufgabe erfüllt:
countSpaces :: String -> Int
countSpaces [] = 0
countSpaces (’ ’ : restOfString)
= 1 + countSpaces restOfString
countSpaces (_ : restOfString)
= 0 + countSpaces restOfString
1, so dass, wenn wir versuchen, (’ ’ : restOfString)
einen Anruf countSpaces "abc"
das Muster zu machen, wird nur immer größer da jedes mal countSpaces
aufgerufen wird, wird dies nur eine ' '
zu restOfString
, es sei denn, jedes Mal countSpaces
wird die erste ch aufgerufen werden ar in der Zeichenfolge wird geändert in: ' '
. so in dem ersten Aufruf von countSpaces "abc"
dann (’ ’ : restOfString)
ist ' ':"bc"
, was verwirrend ist richtig, da es "a"
mit einem leeren statt consing ersetzt es so, dass wir bekommen: " abc"
'" abc "' ist nur syntaktischer Zucker für '['a', 'b', 'c']' oder ''a': 'b': 'c': []'. – chepner
Sie verwenden seltsame Apostrophe. Vergleiche das: '' 'mit deinem,' ''. Sie sind verschiedene Charaktere. – Arnon