Pourquoi suis-je recevoir « modèles non-exhaustive en fonction ... » quand je Invoke ma fonction Haskell substring?

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

  •  05-10-2019
  •  | 
  •  

Question

Je travaille mon chemin à travers le livre Haskell Road to Logic, Maths et programmation . (Je suis seulement à mi-chemin à travers le chapitre 1, mais je profite jusqu'à présent et ont l'intention de continuer.) Je l'ai lu dans la section 1.5 « Jouer le jeu Haskell » qui « se compose d'un certain nombre d'autres exemples obtenez vous familiariser avec [Haskell] ». Jusqu'à présent, je l'ai appris sur les fonctions, les déclarations de type, équations Surveillé, un peu correspondant de la liste de motifs, et où et laisser faire.

Je suis coincé sur l'exercice 1,17, ce qui nous demande d'écrire une sous-fonction :: String -> String -> Bool où:

  1. si xs est un préfixe de ys, xs est une sous-chaîne de ys
  2. si ys y est égal à: YS et xs est une sous-chaîne de YS, xs est une sous-chaîne de ys
  3. est rien d'autre une sous-chaîne de ys

J'utilisé la fonction de préfixe fourni dans un exemple précédent:

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

Et puis essayé:

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

... et peut d'autres permutations de cela.

Quand je lance substring "abc" "xxxabcyyy" je reçois True, mais quand je lance substring "abc" "xxxabyyy" je reçois "*** Exception: substring.hs: (3,0) - (5,45): les modèles non-exhaustive en fonction substring". Je ne peux pas comprendre pourquoi. Je ne comprends pas comment il pourrait y avoir des modèles non-exhaustive lors de l'utilisation « autrement ».

BTW, le livre n'a pas encore couvert if-then-else. Je préfère garder cela de ma solution, pour l'instant.

Était-ce utile?

La solution

Vous avez une faute de frappe dans le nom de la fonction:

subsstring xs [] = False

En raison de la faute de frappe ce déclare une nouvelle fonction subsstring, pas un cas de la fonction substring.

La fonction substring lui-même n'a alors aucun cas qui correspondrait à un second paramètre de [].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top