J'essaie actuellement de construire un solveur de lambda-calcul, et j'ai un léger problème avec la construction de l'AST. Un terme de calcul de lambda est inductivement défini comme suit:Haskell AST avec types récursifs
1) Une variable
2) lambda, une variable, un point, et une expression lambda.
3) Une parenthèse, une expression lambda, une expression lambda et une parenthèse.
Ce que je voudrais faire (et d'abord essayé) est la suivante:
data Expr =
Variable
| Abstract Variable Expr
| Application Expr Expr
travailler Maintenant, évidemment cela ne veut pas, car variable est pas un type, et abstraite Expr variable attend types. Donc, ma solution à ce hacky est d'avoir:
type Variable = String
data Expr =
Atomic Variable
| Abstract Variable Expr
| Application Expr Expr
Maintenant, ce qui est vraiment gênant puisque je n'aime pas la variable atomique sur son propre, mais abstraite prenant une chaîne plutôt qu'une expr. Y a-t-il un moyen de rendre cela plus élégant et de le faire comme la première solution?
Votre deuxième définition que vous trouvez désagréable est la manière standard de le faire. Mon conseil est de s'y habituer. Vous pensez d'une manière qui n'est pas compatible avec le système de types de Haskell, alors allez-y et entraînez-vous. – luqui