URL: https://linuxfr.org/forums/programmationautre/posts/gunfold-et-data-haskell Title: gunfold et Data (Haskell) Authors: PyroTokyo Date: 2015年11月25日T05:10:32+01:00 License: CC By-SA Tags: Score: 1 Bonjour à tous Je me suis remis un peu au Haskell récemment, et au détour d'un article sur les [Data](http://chrisdone.com/posts/data-typeable), 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](http://stackoverflow.com/questions/30058605/using-gunfold-to-fill-in-positional-arguments) 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 ```haskell 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 à ```haskell 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.

AltStyle によって変換されたページ (->オリジナル) /