Всем привет!
Помогите, пожалуйста, столкнулся со следующей проблемой, возможно немного ламерской:
У меня есть тип Expr определенный (для примера) как
data Expr
= Int Integer
| Call String [Expr]
И так далее - смысл в том, что его конструкторы ссылаются на него же.
Я хочу добавить (не заменить, нужны оба) тип TypedExpr, который я изначально хотел определить как
"data TypedExpr = TypedExpr ExprType Expr" - тип и выражение
Однако Expr ссылается на сам себя, и для TypedExpr я бы хотел заменить внутри всех конструкторов Expr на TypedExpr.
То есть в примере выше "Call String [Expr]" по идее должен стать "Call String [TypedExpr]".
Пробовал делать что-то типо
data Expr' e
= Int Integer
| Call String [e]
И определять
type Expr = Expr' Expr - ругается на цикл в определении
type Expr = Expr' Expr' - ругается, вполне очевидно, что для последнего Expr' не хватает аргумента
newtype Expr = Expr (Expr' Expr) - работает, но очень много кода завязано на паттерн матчинге на текущее опредление Expr, и переписывать не хочется. Можно было бы под такой newtype переделать через view-паттерны, но это все равно куча работы, плюс есть много кода который Expr парсит и создает, его приется просто вручную допиливать.
Есть какие-то способы добавить TypedExpr так, чтоб и рыбку съесть, и косточкой не подавиться?