CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Haskell] Non-exhaustive patterns

]Mewtwo[
]Mewtwo[
Niveau 10
11 février 2017 à 13:11:03

Bonjour à vous.

Si y a un pro de ce langage pour m'aider, je l'en remercierai. Je comprends pas bien pourquoi ça ne marche pas :-(

En gros j'ai une fonction maListe qui prend une liste en argument et un entier 'a', et elle doit (en théorie) me renvoyer la liste avec en plus (concaténé) tous les entiers positifs non-nuls inférieurs à 'a'.

Mais j'obtiens, dès que j'essaie de l'utiliser, l'erreur :d) Non-exhaustive patterns in function maListe :-(

maListe a [b] = if a>0 then maListe (a-1) [b]++[a] else [b]
Message édité le 11 février 2017 à 13:11:35 par ]Mewtwo[
Pseudo supprimé
Pseudo supprimé 11 février 2017 à 13:48:01

Tu as définis la fonction avec maListe a [b] ce qui signifie que le second argument va "matcher" avec un objet de la forme [b] : c'est à dire une liste à UN SEUL élément. Ta fonction ne marchera pas pour les listes dont la structure est [] (liste vide) ou x:x':xs (liste à au moins deux éléments).

Exemple :

f [] = 0
f [x] = 1
f (_:xs) = 2

Selon la liste que tu passes en paramètre de la fonction f (qui représente une seule fonction) le retour sera différent selon la structure de la liste passée en paramètre. C'est le pattern-matching.

Si tu veux une liste générale sans te soucier de sa structure il faudrait un identificateur plus général.

Exemple :

f l = 3

Autres exemples de pattern-matching :

not True = False
not False = True

and True True = True
and _ _ = False

PS : Je suppose que tu cherchais à spécifier que le second argument est une liste mais Haskell (et la plupart des autres langages fonctionnels comme OCaml) peuvent déduire le type selon l'utilisation des objets par la fonction. Si tu veux spécifier pour toi même le type des fonctions tu peux utiliser des annotations de types. Par exemple : addition_int :: Int -> Int -> Int à placer au dessus des définitions de fonctions. Cela sert aussi à s'assurer qu'une fonction a le type qu'on souhaite.

Message édité le 11 février 2017 à 13:52:35 par Pseudo supprimé
]Mewtwo[
]Mewtwo[
Niveau 10
11 février 2017 à 15:04:48

Merci pour ta réponse complète, j'étais à coté du truc. Je pensais que [b] signifiait : une liste quelconque de nom 'b'. J'ai bien compris grâce à toi :ok:

comme ça ça marche bien du coup :oui:

 maListe a b = if a>0 then maListe (a-1) b++[a] else b
Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment