Dire que j'ai la GADT suivante:Ne peut pas détruire le type transitif
data Stage a b where
Comb :: Stage a b -> Stage b c -> Stage a c
FMap :: (a -> b) -> Stage a b
Je veux maintenant une fonction qui fonctionne comme ceci:
run (a `Comb` b) = (a,b)
run (FMap f) = (FMap f,FMap id)
Comment pourrais-je construire une telle fonction?
J'ai essayé différentes manières de lier les types mais je n'ai pas réussi. Y at-il une extension qui me manque qui permet des liaisons de type plus étendues?
Voici le message d'erreur:
Couldn't match type `t' with `(Stage t1 b, Stage b t2)'
`t' is a rigid type variable bound by
the inferred type of run :: Stage t1 t2 -> t at <interactive>:11:5
In the expression: (a, b)
In an equation for `run': run (a Comb b) = (a, b)
Une description de ce que je veux accomplir: Je veux concevoir un DSL et une piste de fonction qui peut essayer d'exécuter un code de la LIS dans un couple de différentes manières (j'ai plusieurs fonctions d'exécution différentes pour chaque voie). La fonction d'exécution essaiera d'exécuter autant de code que possible, puis indiquera quel code elle n'a pas pu être exécutée et quel sera le résultat du code qu'elle pourrait exécuter.
Vous aurez besoin d'une signature de type pour 'run', parce que vous êtes sur un modèle correspondant GADT. De plus, si vous renvoyez '(a, b)', vous avez un type existentiel qui s'échappe, donc cela ne peut pas marcher. – kosmikus
@kosmikus Ajoutez cela comme une réponse SVP. – dave4420
@ dave4420 J'espérais que cela donnerait plus de détails, afin que je puisse donner une vraie réponse. Mais ok ... – kosmikus