Haskell non exhaustive de motifs en fonction de
le code suivant compile bien mais quand j'essaie d'entrée helper 10 nombres premiers [] [] il me donne :Non exhaustive des modèles en fonction helper
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
eea :: Integer -> Integer -> (Integer, Integer, Integer)
eea 0 b = (0, 1, b)
eea a b = (y - b `div` a * x, x, g) where (x, y, g) = eea (b `rem` a) a
second :: (a, b, c) -> b
second (_, x, _) = x
chinese :: Integer -> [(Integer,Integer)] -> Integer
chinese n [] = 0
chinese n ((a,b):xs) = ((second(eea b (n `div` b)) * (n `div` b) ) * a) + chinese n (xs)
getN :: [(Integer,Integer)] -> Integer
getN [] = 1
getN ((x,y):xs) = y*(getN (xs))
chinese2 :: [(Integer,Integer)] -> Integer
chinese2 [] = 0
chinese2(x:xs) = chinese (getN (x:xs)) (x:xs)
chinese3 :: [(Integer,Integer)] -> Integer
chinese3 (x:xs) = if (chinese2(x:xs)) < 0 then chinese2 (x:xs) + (getN (x:xs)) else chinese2 (x:xs)
helper :: Integer -> [Integer] -> [Integer] -> [(Integer,Integer)] -> [Integer]
helper n [] (v) _ = []
helper n (x:y:xs) (v) (c:cs) = if (chinese3 (b:c:cs) == n) then (x:v) else helper n (xs) (x:v) ((n `mod` y,y):c:cs) where b =(n `mod` x,x)
Le problème démontrée sur ideone
OriginalL'auteur Fady Kamal | 2012-01-05
Vous devez vous connecter pour publier un commentaire.
chinese3
a aucun cas de la liste vide.helper
manque plusieurs cas, dont un où le second argument est un élément.j'ai mis à jour la fonction d'assistance et de la chinese3 dans il ne doit pas être vide lorsque j'insère le b il
OriginalL'auteur Fred Foo
Ce que vous êtes en train d'essayer d'évaluer:
Votre équations pour
helper
:Nous allons essayer de correspondre à la première équation:
n = 10
correspond[] = primes
ne correspond pasOK, nous allons essayer de correspondre à la deuxième équation de la place:
n = 10
correspond(x:y:xs) = primes
matches, avecx = 2
y = 3
xs = [5, 7, 11, 13, ...]
v = []
correspond(c:cs) = []
ne correspond pasDonc ni le motif correspond. Nous avons une correspondance de modèle de l'échec.
OriginalL'auteur dave4420
Basé sur la première ligne de la définition de
helper
, il correspondra à une liste vide ([]) dans le deuxième argument. Basé sur la deuxième ligne, il sera de match sur une liste d'au moins deux valeurs dans le deuxième argument (x:y:xs). Ce qui laisse un seul élément de la liste d'inventaire.MODIFIER
Par souci de simplicité, supposons que les nombres premiers est définie comme ceci:
Maintenant, quand vous évaluer cette expression:
Clairement c'est la deuxième partie de la définition de
helper
qui sont accompagnés ici (la première partie serait seulement siprimes
ont été d'une liste vide). Maintenant basé sur le modèle pour le deuxième paramètre(x:y:xs)
, nous pouvons voir quex
sera lié à2
,y
sera lié à3
etxs
sera lié à[5]
. Dans la définition dehelper
vous êtes à l'application de la fonction de manière récursive à l'aide dexs
comme deuxième argument. En d'autres termes, il ressemble à quelque chose comme ceci:Auquel cas de la
helper
fonction sera utilisée ici?[5]
n'est pas une liste vide, donc pas le premier. Le deuxième cas? Non, seuls les matchs contre une liste de au moins deux valeurs (la valeur qu'auraity
se limite?). J'espère que vous pouvez maintenant voir que vous n'avez pas comptabilisés lors de l'helper
est appelée avec un seul élément de la liste en tant que second paramètre (qui, en pratique, va arriver à tout moment de l'appel àhelper
avec une liste d'un nombre impair de valeurs dans le deuxième paramètre).Quelle est la partie de l'explication n'a pas de sens? De tout ça? Je suppose que vous comprenez que l'expression
[]
ne match contre une liste vide, alors peut-être vous êtes confus au sujet de lax:y:xs
cas?oui la liste vide [] - je entrer les nombres premiers de la liste qui n'est pas vide dans la 2e ligne, et correspond à la x:y:xs dans la 3ème ligne
J'ai ajouté un peu verbeux explication de comment cela fonctionne. J'espère que ça aide.
OriginalL'auteur Daniel Pratt