J'écris actuellement un analyseur d'expression. J'ai fait l'analyse lexicale et syntaxique et maintenant je vérifie les types. Je l'expression dans une structire de données comme celui-ci (version simplifiée):Comment créer une fonction Haskell qui introduirait un nouveau type?
data Expr = EBinaryOp String Expr Expr
| EInt Int
| EFloat Float
Et maintenant je besoin d'une fonction qui convertirait à un nouveau type, dites TypedExpr
, qui contiendrait également des informations de type. Et maintenant mon problème principal est, comment ce type devrait ressembler. J'ai deux idées - avec paramètre de type:
data TypedExpr t = TEBinaryOp (TBinaryOp a b t) (TExpr a) (TExpr b)
| TEConstant t
addTypes :: (ExprType t) => Expr -> TypedExpr t
ou sans:
data TypedExpr = TEBinaryOp Type BinaryOp TypedExpr TypedExpr
| TEConstant Type Dynamic
addTypes :: Expr -> TypedExpr
J'ai commencé avec la première option, mais je suis tombé sur des problèmes, parce que cette approche suppose que vous connaissez le type de l'expression avant de l'analyser (pour moi, c'est vrai dans la plupart des cas, mais pas toujours). Cependant, je l'aime bien, car cela me permet d'utiliser le système de types de Haskell et de vérifier la plupart des erreurs au moment de la compilation.
Est-il possible de le faire avec la première option?
Lequel choisiriez-vous? Pourquoi?
À quels problèmes dois-je m'attendre avec chaque option?
Wow! idée intéressante. N'y penserais jamais :) – mik01aj
Je pense que je ne comprends pas trop votre solution - que sont supposés faire 'eInt',' eBinaryOp'? Où dois-je mettre mon 'Expr' dans ce modèle? – mik01aj