Récemment j'ai finalement commencé à sentir que je comprenais les catamorphismes. J'en ai écrit quelques-unes dans a recent answer, mais brièvement je dirais un catamorphisme pour un type abstrait sur le processus de traverser récursivement une valeur de ce type, avec les correspondances de modèle sur ce type réifiées en une fonction pour chaque constructeur que le type a. Bien que j'accueillerais volontiers des corrections sur ce point ou sur la version plus longue dans la réponse de la mienne, je pense que je l'ai plus ou moins vers le bas et ce n'est pas le sujet de cette question, juste un peu de contexte. Une fois que j'ai réalisé que les fonctions que vous transmettez à un catamorphisme correspondent exactement aux constructeurs du type, et que les arguments de ces fonctions correspondent également aux types de champs de ces constructeurs, tout se sent soudain tout à fait mécanique et je ne le sais pas. voir où il y a une marge de manœuvre pour des implémentations alternatives. Par exemple, j'ai juste inventé ce type stupide, sans vraiment le concept de ce que sa structure signifie ", et en a dérivé un catamorphisme. Je ne vois pas d'autre façon que je pourrais définir un objectif général pli sur ce type:Est-ce que chaque type a un catamorphisme unique?
data X a b f = A Int b
| B
| C (f a) (X a b f)
| D a
xCata :: (Int -> b -> r)
-> r
-> (f a -> r -> r)
-> (a -> r)
-> X a b f
-> r
xCata a b c d v = case v of
A i x -> a i x
B -> b
C f x -> c f (xCata a b c d x)
D x -> d x
Ma question est, est-tous les types ont une catamorphisme unique (à réordonner argument)? Ou y a-t-il des contre-exemples: types pour lesquels aucun catamorphisme ne peut être défini, ou types pour lesquels existent deux catamorphismes distincts mais également raisonnables? S'il n'y a pas de contre-exemples (c.-à-d., Le catamorphisme pour un type est unique et trivialement dérivable), est-il possible de faire en sorte que GHC dérive pour moi une sorte de classe de type automatiquement?
Choisissez un morceau de votre expression de type, appliquer la 'a ~ isomorphisme forall b. (a -> b) -> b', voilà. –
J'ai écrit un générateur pour les catamorphismes dans le modèle Haskell: https://github.com/KommuSoft/template-fun. Il ne couvre pas encore toutes les déclarations de type, mais ce n'est pas un problème fondamental. Les catamorphismes afaik peuvent donc être dérivés automatiquement. –
@BenjaminHodgson J'ai peur que ce soit un peu trop concis pour moi. Je ne pense pas comprendre la suggestion du tout. – amalloy