2016-03-27 1 views
0

im apprentissage et haskell récursion avec elle, j'ai cette fonctionPourquoi im obtenir 'Modèles non-exhaustifs dans la fonction subcombina'?

type Coordenada = (Int,Int) 
type Skyline = [Coordenada] 

combina :: (Skyline, Skyline) -> Skyline 
combina ([], x) = x 
combina (x, []) = x 
combina ((ii, ia):ri,(di, da):rd) = subcombina((ii, ia):ri,0) ((di, da):rd,0) 
     where subcombina ((ii, ia):ri, ih) ((di, da):rd, dh) 
          | ii < di    = (ii, max ia dh) : subcombina(ri,ih) ((di, da):rd, dh) 
          | otherwise    = (di, max ih da) : subcombina((ii, ia):ri, ih) (rd, dh) 

Et im obtenir cette erreur:

Exception: Skyline.hs:(26,11)-(28,92): Non-exhaustive patterns in function subcombina 

modèle sorcière im manquant?

fonction Explication:

combina (fusion) reçoit un tuple de liste de tuples, si l'un d'entre eux son vide, l'autre résultat. Ensuite, pour la liste gauche des tuples, obtenir le premier tuple par élément et la queue, et même pour tuple droit, appeler subcombina (submerge) avec ces valeurs et 0

la sous-combinaison reçoit la même chose que la combinaison avec une valeur entière par tuple (tuple1, int1) (tuple2, int2), avec les motifs suivants:

Si la valeur de gauche de la tête de gauche est supérieure à la valeur de gauche de la tête de droite, retourner un tuple de (première valeur de la tête de gauche, max des entiers) concat avec appel récursif à subcombina avec liste gauche sans tête et même entier que parent et liste de droite du parent tuple droit avec le même entier que parent. Si ce n'est pas quelque chose de similaire à celui ci-dessus.

J'espère que c'est bien expliqué.

+1

BTW . votre explication des fonctions est juste une reformulation de votre code, la prochaine fois essayer de donner une explication dans le contexte (qu'est-ce que vous essayez d'atteindre), et saupoudrer avec un exemple ou deux. – epsilonhalbe

+1

Je recommande fortement d'activer les avertissements avec '-Wall': cela vous aidera à détecter ces problèmes au moment de la compilation. – chi

+0

@epsilonhalbe Im résolvant l'algorithme de problème de skyline http://www.geeksforgeeks.org/divide-and-conquer-set-7-the-skyline-problem/#disqus_thread c'est la fonction de fusion – colymore

Répondre

2

vous êtes correspondance de motif sur les listes

subcombina ((_:_), (_:_)) = .. 

matchs sur un tuple non vide, ce cette erreur/avertissement vous indique que vous avez oublié de prendre en charge des cas comme

subcombina ([], something) = .. 
subcombina (something, []) = .. 
subcombina ([], []) = ..