Je développe un petit langage de programmation au moyen de transformations AST. C'est-à-dire, à partir de la VM et en ajoutant lentement des couches qui aident le programmeur.OCaml variantes polymorphes dans la correspondance de modèle
Comme chaque couche sait comment transformer ses nouveaux types, je l'ai fait quelque chose comme ceci:
module AST0 = struct
type t = [
| `Halt
| `In
| `Out
| `Add of (int * int * int)
| `Sub of (int * int * int)
]
let lower (ast : t list) = ast
end
module AST1 = struct
type t = [
AST0.t
| `Inc of int
| `Dec of int
| `Cmp of (int * int * int)
]
let lower (ast : t list) =
let lower_one = function
| `Inc a -> [`Add (a, a, `Imm 1)]
| `Dec a -> [`Sub (a, a, `Imm 1)]
| `Cmp (a, b) -> [`Sub (13, a, b)]
| (x : AST0.t) -> AST0.lower [x] (* <--- problem line *)
in
List.concat @@ List.map lower_one ast
end
Malheureusement je reçois l'erreur:
File "stackoverflow.ml", line 28, characters 8-20:
Error: This pattern matches values of type AST0.t
but a pattern was expected which matches values of type
[? `Cmp of 'a * 'b | `Dec of 'c | `Inc of 'd ]
The first variant type does not allow tag(s) `Cmp, `Dec, `Inc
Je pensais que depuis le compilateur est intelligent assez pour remarquer que je n'ai pas manipulé XY et Z variantes dans un cas de match arbitraire qu'il pourrait dire que x
en AST1.lower
ne sera jamais réellement l'un des Cmp
ou Inc
ou Dec
. Cela ne semble pas être le cas.
Ai-je mal compris le système de type OCaml? Est-ce que je manque quelque chose d'évident? Est-ce une approche stupide?
Donc, cela semble avoir fixé une de mes couches, mais pas une autre. Je regarde maintenant ... – tekknolagi
Comme je m'y attendais, l'autre couche était cassée à cause de quelque chose de stupide que j'ai fait. Merci de votre aide! – tekknolagi