与我今天早些时候提出的这个问题有关。
我有一个包含大量案例的 AST 数据类型,它由“注释”类型参数化
data Expr ann def var = Plus a Int Int
| ...
| Times a Int Int
deriving (Data, Typeable, Functor)
我有 def 和 var 的具体实例,比如Def
and Var
。
我想要的是自动派生fmap
哪个作为第一个参数的函子运行。我想派生一个看起来像这样的函数:
fmap :: (a -> b) -> (Expr a Def Var) -> (Expr b Def Var)
当我使用 normalfmap
时,我收到一条编译器消息,表明 fmap 正在尝试将其函数应用于最后一个类型参数,而不是第一个。
有没有一种方法可以导出所描述的函数,而无需编写一堆样板文件?我试过这样做:
newtype Expr' a = E (Expr a Def Var)
deriving (Data, Typeable, Functor)
但我收到以下错误:
Constructor `E' must use the type variable only as the last argument of a data type
我正在使用其他人的代码库,所以如果我不必在任何地方切换类型参数的顺序,那将是理想的。