On suppose la structure suivante mutuellement récursive:F #: catamorphisme pour les structures de données mutuellement récursives
type Tree<'a> =
| Empty
| Node of 'a * 'a Forest
and Forest<'a> =
| Nil
| Cons of 'a Tree * 'a Forest
Objectif: Générer les catamorphisme communes pour cette structure: foldl, foldr, foldk.
j'ai généré le catamorphisme naïf comme suit:
let rec foldTree fEmpty fNode fNil fCons =
function
| Empty -> fEmpty
| Node (a, f) -> fNode a (foldForest fEmpty fNode fNil fCons f)
and foldForest fEmpty fNode fNil fCons =
function
| Nil -> fNil
| Cons (t, f') -> fCons (foldTree fEmpty fNode fNil fCons t) (foldForest fEmpty fNode fNil fCons f')
Comment procéder pour « mécaniquement » la génération de la foldl récursive (en utilisant des accumulateurs) et foldr récursive (en utilisant continuations) ?
J'ai traversé Scott's Recursive Types and Folds series et je comprends comment générer 'mécaniquement' les plis pour une structure récursive. Cependant, je ne trouve rien sur google pour faire la chose «mécanique» pour les structures de données récursives. PS: On peut se débarrasser de la récursivité réciproque ci-dessus par in-lining mais on la conserve car elle représente une version simplifiée de la récursivité réciproque dans tpetricek's Markdown parser.
Qu'entendez-vous par «mécaniquement»? Pour autant que je puisse voir, votre fonction fait ce que vous vouliez, mais je ne sais pas comment vous voulez l'améliorer? –
(Sur une note légèrement différente, je trouve que cette façon de traiter les arbres est bien en théorie, mais en pratique, je pense qu'il est plus utile d'écrire des fonctions plus spécialisées pour les opérations courantes que vous pourriez faire sur votre arbre. et laisser les gens juste correspondre à la structure s'ils ont besoin de la structure complète générale.En d'autres termes, je pense que les "catamorphismes" ne sont pas très utiles pour le code lisible - ce qui explique pourquoi l'analyseur Markdown ne les implémente pas :) –