现在,我有一个 AST 表达式,它在递归类型上是多态的:
data Expr a = Const Int
| Add a a
Run Code Online (Sandbox Code Playgroud)
这非常有用,它允许我使用一种类型进行普通递归 ( Fix Expr),而在需要附加额外信息时使用另一种类型( Cofree Expr ann)。
当我想在这个递归方案中引入另一种类型时会出现问题:
data Stmt a = Compound [a]
| Print (Expr ?)
Run Code Online (Sandbox Code Playgroud)
如果Expr不引入额外的类型变量并破坏与我已经编写的所有通用函数的兼容性,我不确定该术语的内容。
可以这样做吗,如果可以,这是一种有用的模式吗?