Match failure ocaml

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Match failure ocaml

par Rockleader » 25 Nov 2015, 17:41

Bonsoir,

je commence à désespérer donc je viens quémander un petit coup de main là dessus ^^

En effet, je tombe sur une exception de type match failure
Exception: Match_failure ("", 199, 1).


lorsque j'appelle cette fonction

Code: Tout sélectionner
let rec concatArbre2 = fun a ->
   match a with
   |Feuille(n,p,r) -> personnetoString2(feuilleToTriplet a)
   |Noeud(b,i,c) -> personnetoString2 i ^"("^ concatArbre2 b ^ ","  ^ concatArbre2 c^")";;


L'ensemble de mes fonction travaille avec ce type de donnée

Code: Tout sélectionner
type 'a arbre=
  Feuille of 'a
 |Noeud of ('a arbre * 'a * 'a arbre);;


La fonction semble bug dans le plus simple des cas. Prenons une simple feuille

Code: Tout sélectionner
let p2=Feuille("b","X","+");;


concatArbre2 p2 renverra l'exception match failure.

Je pense que le problème vient de abbreToRepre

Code: Tout sélectionner
let abbreToRepre2 = fun p -> fun r ->
   match r with
   |"?" -> (match p with
         |"E" -> "eau+glace?"
         |"F" -> "feu+lave?"
         |"T" -> "terre+bois?"
         |"A" -> "air+foudre?"
         |"X" -> "aucun"
         |"?" -> "??"
         |_ -> failwith "pouvoir impossible")
   |"=" -> (match p with
         |"E" -> "eau"
         |"F" -> "feu"
         |"T" -> "terre"
         |"A" -> "air"
         |"X" -> "aucun"
         |"?" -> "?"
         |_ -> failwith "pouvoir impossible")
   |"+" -> (match p with
         |"E" -> "eau+glace"
         |"F" -> "feu+lave"
         |"T" -> "terre+bois"
         |"A" -> "air+foudre"
         |"X" -> "aucun"
         |"?" -> "?+"
         |_ -> failwith "pouvoir impossible")
   | _ -> failwith "rang inconnu";;


Sauf que je ne vois vraiment pas où j'oublie un cas de match sachant que j'ai des failwith automatique sur chaque match...

En ce qui concerne les autres fonction de concatArbre2 ;

feuilleToTriplet prend une Feuille et renvoie son triplet. En gros Feuille(a,b,c) -> (a,b,c)

personneToString2 prend un triplet et renvoie son les infos sous un certains format qui appelle abbreToRepre

Code: Tout sélectionner
let personnetoString2 = fun p ->
   (nom2 p)^"["^(abbreToRepre2 (pouvoir2 p) (rang p))^"]";;


nom pouvoir et rang sont des fonction qui renvoient respectivement le premier/second/troisième élément d'un triplet.

Dès l'appel de personneToString sur un simple triplet on a l'exception du match failure.


En espérant que vous y verrez plus clair que moi x)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 25 Nov 2015, 18:13

EDIT:

J'ai fini par débusqué l'erreur, par contre je ne comprends pas pourquoi l'interpréteur me parlait de match failure alors que ça n'avait rien à voir

Code: Tout sélectionner
let personnetoString2 = fun p ->
   (nom2 p)^"["^(abbreToRepre2 (pouvoir2 p) (rang p))^"]";;


Les parenthèses entourant abbreToRepre faisait qu'au final je ne me retrouvais pas avec

chaine1 ^chaine2

mais

chaine1 ^(chaine2)

Du coup, c'est la concaténation qui marchait pas et non pas la fonction abbreToRepre comme je le pensais au début.

Pourquoi indiquer une erreur sur le matching dans ce cas là ? J'avoue que si quelqun pouvait m'expliquer ça pourrait m'aider à voir l'erreur plus vite la prochaine fois --'
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite