Warum bekomme ich „Nichterschöpfende Muster in Funktion ...“, wenn ich meine invoke Haskell Funktion substring?

StackOverflow https://stackoverflow.com/questions/3799359

  •  05-10-2019
  •  | 
  •  

Frage

Ich arbeite mich durch das Buch Die Haskell Road to Logik, Mathematik und Programmierung . (Ich bin nur auf halben Weg durch Kapitel 1, aber ich genieße es so weit und die Absicht fortzusetzen.) Ich habe gelesen, durch den Abschnitt 1.5 „Wiedergabe des Haskell Games“, die „von einer Reihe weiterer Beispiele bestehen zu erhalten Sie mit [Haskell]“bekannt. Bisher habe ich über Funktionen gelernt, Typdeklarationen, bewacht Gleichungen, ein wenig über die Liste Pattern-Matching, und wo & lassen.

Ich bin auf Übung stecken 1.17, die uns eine Funktion String schreiben fragt :: String -> String -> Bool Dabei gilt:

  1. , wenn xs ein Präfix von ys ist, xs ist ein Teil von ys
  2. , wenn ys gleich y: ys' und xs ein Teil von ys ist, xs ein Teil von ys
  3. nichts anderes ist ein Teil von ys

I verwendet, um die Präfix-Funktion in einem vorhergehenden Beispiel angegeben:

prefix :: String -> String -> Bool
prefix [] ys = True
prefix (x:xs) [] = False
prefix (x:xs) (y:ys) = (x==y) && prefix xs ys

Und dann versucht:

substring :: String -> String -> Bool
subsstring xs [] = False
substring xs (y:ys) | prefix xs (y:ys) = True
                    | substring xs ys  = True
                    | otherwise        = False

... und kann andere Permutationen davon.

Wenn ich laufen substring "abc" "xxxabcyyy" ich True bekommen, aber wenn ich substring "abc" "xxxabyyy" laufen erhalte ich "*** Ausnahme: substring.hs: (3,0) - (5,45): Nicht erschöpfende Muster in Funktion String". Ich kann nicht herausfinden, warum. Ich verstehe nicht, wie es nicht erschöpfende Muster sein könnte, wenn ich „anders“.

BTW, hat das Buch noch nicht if-then-else bedeckt. Ich würde es vorziehen, dass aus meiner Lösung zu halten, denn jetzt.

War es hilfreich?

Lösung

Sie haben einen Tippfehler in der Funktion Name:

subsstring xs [] = False

Aufgrund der Typo dies deklariert eine neue Funktion subsstring, keinen Fall der substring Funktion.

Die substring Funktion selbst dann keinen Fall, der einen zweiten Parameter von [] entsprechen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top