Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Haskell
Haskell Forum d'entraide sur la programmation en langage fonctionnel Haskell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/11/2012, 14h35   #1
garheb
Membre régulier
 
Inscription : juin 2011
Messages : 139
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 139
Points : 78
Points : 78
Par défaut Fonction simple, mais incapable de trouver l'erreur

Bonjour à tous,

J'avais ce matin en midterm une fonction à faire. La fonction écrite compilait bien, mais à l'exécution toujours la même erreur:

Citation:
:3:8 Couldn't match type 'Integer' with 'Pile a0'.
Expected type: Pile(Pile a0)
Actual type: Pile Integer

In the first argument of 'sommet', namely 's1'
In the expression: sommet s1
In an equation for 'it':it=sommet s1
Voici le code écrit

Code :
1
2
3
4
5
6
7
8
9
10
11
12
data Pile a= PileVide | Pile {valeurP::a, precedent::(Pile a)} deriving Show --création d'un type pile, qui contient une pile vide ou une valeur et une pile (la valeur précédente dans la structure

--fonction sommet, renvoie une PileVide si on passe une PileVide en paramètre
-- sinon, renvoie la valeur de la pile en paramètre
sommet PileVide = PileVide 
sommet (Pile valeurP precedent) = valeurP

--déclarations de piles
s4 = Pile {valeurP=4, precedent=PileVide}
s3 = Pile {valeurP=5, precedent=s4}
s2 = Pile {valeurP=6, precedent=s3}
s1 = Pile {valeurP=7, precedent=s2}
Et pour le test dans la console ghci une fois compilé:

Ca m'a bloqué durant ~1h, pour sans doute un truc tout bête, mais j'ai beau avoir retourné la fonction dans tous les sens, rien ne fonctionnait.

Merci par avance.
garheb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2012, 15h36   #2
garheb
Membre régulier
 
Inscription : juin 2011
Messages : 139
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 139
Points : 78
Points : 78
Problème résolu grâce à Sehnsucht.

Étant donné que je renvoie un coup un Integer et l'autre coup un PileVide, la fonction ne sait pas se définir et soulève une erreur.

Bref la correction:

Code :
1
2
3
4
5
6
7
8
9
data Pile a= PileVide | Pile {valeurP::a, precedent::(Pile a)} deriving Show

sommet PileVide = error "empty list"
sommet (Pile valeurP precedent) = valeurP

s4 = Pile {valeurP=4, precedent=PileVide}
s3 = Pile {valeurP=5, precedent=s4}
s2 = Pile {valeurP=6, precedent=s3}
s1 = Pile {valeurP=7, precedent=s2}
garheb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h07.


 
 
 
 
Partenaires

Hébergement Web