Forum Programmation.autre gunfold et Data (Haskell)

Posté par . Licence CC by-sa
Tags : aucun
1
25
nov.
2015

Bonjour à tous

Je me suis remis un peu au Haskell récemment, et au détour d'un article sur les Data, j'ai décidé de creuser plus en profondeur.

Jusqu'au use case 5, ça se passe assez bien, mais d'un coup en tombant sur fromConstrM, je patauge. Je ne comprends juste pas comment on fait pour naviguer dans la structure du type.

J'ai été voir dans le code source, et après en avoir appris un peu plus sur gunfold, gfoldl et compagnie, je ne suis pas plus avancé. J'ai aussi été voir ce poste sur stackoverflow, mais mis à part le fait que toute la magie se passe dans le gunfold je n'en ai pas retiré grand chose.

Je sais ce qu'est un fold ou un unfold, donc j'arrive à voir grosso-modo ce qui est fait, mais je n'ai aucune idée de pourquoi ça marche.
< boulet > Je ne vois même pas pourquoi on rentre 2 fois dans le 'do' au sein du fromConstrM < /boulet >

A titre d'exemple, j'ai essayé d'utiliser une liste de fromConstr plutôt que la monade State pour initialiser, mais vu que je ne comprends pas la mécanique en dessous, ça me donne des résultats assez aléatoire. Ca marche pour un constructeur à une variable, mais pas plus

data Foo = Foo Int deriving (Data,Typeable,Show)
let args = [fromConstr (toConstr (5::Int)), fromConstr (toConstr (10::Int))]
let result = fromConstrM args (toConstr (Foo 1))

et j'obtiens bien une liste avec [Foo 5, Foo 10]
Par contre, si je passe à

data Goo = Goo Int Char deriving (Data,Typeable,Show)

je ne sais plus comment passer les arguments correctement.

De ce que j'en lis, les Data ont l'air réservés à des usages assez spécifiques, et on trouve peu de ressources à leur sujet, à part la doc officielle et quelques posts sur les parseurs et generics.

  • # Commentaire supprimé

    Posté par . Évalué à 1. Dernière modification le 08/12/15 à 11:51.

    Ce commentaire a été supprimé par l'équipe de modération.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.