Le constructeur de listes :: a pour type :
'a -> 'a list -> 'a list
Aux lignes 15 et 16 de ton exemple, tu essaies de placer une liste en tête d'une liste, alors que tu ne peux placer qu'un élément.
Tu cherches plutôt un opérateur de concaténation ^, qui a pour type :
'a list -> 'a list -> 'a list
Ceci étant, ton code est aussi assez maladroit pour plusieurs raisons :
- plutôt que d'utiliser fst, snd, tu devrais pouvoir obtenir les éléments contenus dans etat par un filtrage par motif avec un motif come (x, (y, z))
- pourquoi ne pas avoir seulement des ('a * 'b * int) ? Quel est l'intérêt de la forme ('b * ('a * int)) ?
- plutôt que d'écrire :
if cond then true else quelquechose
tu peux écrire :
- plutôt que de réécrire les types cinquante fois, utilise des abréviations :
type etat == ('a * 'b * int)
voire un type algébrique, éventuellement sous formes d'enregistrements :
type 'a 'b etat == { nom_de_a : 'a ; nom_de_b : 'b ; nom_de_i : int }
Enfin, je ne suis pas certain de ce que tu souhaites faire, mais un schéma de récursivité explicite avec une concaténation sur le retour de l'appel récursif n'est pas forcément ce que tu souhaites (peu efficace, est-ce vraiment nécessaire à ton but ?)
Partager