[résolu] Utilisation de List dans "Yet Another Haskell Tutorial"

Utilisation de List dans "Yet Another Haskell Tutorial" [résolu] - Langages fonctionnels - Programmation

Marsh Posté le 01-10-2007 à 01:45:37    

Salut,
 
Ca commence à faire un bon moment que je galère sur un truc tout con (enfin, j'ai l'impression). C'est à propos du paragraphe 4.5.3 du tuto cité dans le sujet ("Recursive Datatypes" ).
 
L'auteur défini un type List et une fonction listLength de la façon suivante:

Code :
  1. data List a = Nil
  2.            | Cons a (List a)
  3. listLength Nil = 0
  4. listLength (Cons x xs) = 1 + listLength xs


Or, c'est là que je me sens particulièrement naze, impossible d'utiliser listLength (sur autre chose que Nil s'entend).
Dans toutes les définitions de type précédentes, ça allait, mais sur ce List, rien à faire.
Bien sûr, j'ai tenté le -logique me semble-t-il- listLength (Cons 42), et puis à l'aveuglette (c'est mal je sais, mais là je comprends vraiment pas) des variantes avec [], en remplaçant Cons par List... et d'autres manips que je trouve illogique comparé aux exos de types précédent.
 
Bref, au secours, comment utiliser listLength avec ce type List svp?
 
Edit: pardon, j'oubliais le message d'erreur qui va avec:

Citation :

*DataTypes> listLength (Cons 42)
 
<interactive>:1:12:
    Couldn't match expected type `List t'
           against inferred type `List t1 -> List t1'
    In the first argument of `listLength', namely `(Cons 42)'
    In the expression: listLength (Cons 42)
    In the definition of `it': it = listLength (Cons 42)


Message édité par IrmatDen le 01-10-2007 à 23:19:51
Reply

Marsh Posté le 01-10-2007 à 01:45:37   

Reply

Marsh Posté le 01-10-2007 à 10:55:56    

Ah, j'ai oublié de le noter hier soir, mais la variante avec crochet (listLength [42]) me sort une erreur type:
"Couldn't match expected type 'List t'
agains inferred type '[a]'"
(désolé, je ne me souviens plus du message exact et n'ai pas de quoi testé ici, j'éditerais si je peux installer ghc ici)

Reply

Marsh Posté le 01-10-2007 à 23:19:34    

J'ai trouvé \o/
Verbosité me voilà:

Code :
  1. listLength $ Cons 42 $ Cons 53 $ Cons 24 $ Cons 51 Nil

Reply

Marsh Posté le 03-10-2007 à 11:51:40    

En fait ton problème n'est pas avec l'utilisation de listLength, mais avec la construction d'une List:
 
Un objet de type List est composé:
   -> De Nil
   -> Ou d'un Cons (item, List)
 
Donc le dernier item d'un objet List doit toujours être un Nil ;)
 
(Cons 42) ne crée en fait pas un objet List t, mais une fonction (List t -> List t) (essaies :t Cons 42 dans ghci, et compare à :t Cons 42 Nil, ensuite tu peux regarder le type de listLength)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 03-10-2007 à 12:07:02    

Merci, c'est en fait ce que j'ai compris après avoir justement fais ce que tu recommandes :) (Ca m'a permis de percuter, que sans "marqueur de fin", l'expression était incomplète.)
Ceci dit, c'était un peu idiot comme problème, en relisant une ou 2 fois de plus, j'aurais dû trouver :/

Reply

Marsh Posté le 03-10-2007 à 12:11:42    

IrmatDen a écrit :

Merci, c'est en fait ce que j'ai compris après avoir justement fais ce que tu recommandes :) (Ca m'a permis de percuter, que sans "marqueur de fin", l'expression était incomplète.)
Ceci dit, c'était un peu idiot comme problème, en relisant une ou 2 fois de plus, j'aurais dû trouver :/


Si t'as jamais utilisé de langages fonctionnels auparavant, et jamais été un grand fan d'implémenter des listes chaînées, c'est pas nécessairement flagrant :p


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 03-10-2007 à 12:21:37    

Bien vu; c'est la première fois que je touche à ce genre de langage, et les listes chaînées, j'ai dû coder ça une fois ou 2 dans un exo en débutant le C++ (et le C à l'école *beurk*), depuis, je fais confiance aux libs bien écrites :D

Reply

Marsh Posté le 03-10-2007 à 12:36:16    

Juste par curiosité mal placée... tu utilise Haskell dans quel domaine ?

Reply

Marsh Posté le 03-10-2007 à 16:07:03    

Personnellement, c'est juste pour apprendre en ce moment; quand j'aurais fini quelques tutos, je verrais ce pour quoi je suis motivé (probablement du graphisme à première vue, mais un peu de tests pour voir comment en faire un serveur, bref c'est flou).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed