Предположим, что я хочу смоделировать простой тип выражения в OCaml:
type expr =
| `Int of int
| `Str of string
| `IntAdd of expr * expr
| `StrAdd of expr * expr
Можно ли ограничить expr
в expr * expr
конкретными конструкторами самого expr
(т. Е. Я бы хотел, чтобы IntExpr
разрешал только Int)? Я могу имитировать это с рисунком
соответствие, но оно становится громоздким после расширения expr
. Можно как нибудь
использовать систему типов OCaml для достижения этой цели?
Я попытался использовать верхние границы полиморфного типа следующим образом:
type expr =
| `Int of int
| `Str of string
| `IntAdd of [< `Int] * [< `Int]
| `StrAdd of [< `Str] * [< `Str]
но компилятор не принимает это (с сообщением In case IntAdd of [< Int ] * ([< Int ] as 'a) the variable 'a is unbound
). Есть ли какая-нибудь хитрость, чтобы заставить это работать?