我正在编写一个小型编程语言的解释器,AST 大致如下:
data Value a = IntVal a Int | FloatVal a Float
data Expr a = AddExpr a (Value a) (Value a) | MulExpr a (Value a) (Value a)
我使用参数 a
存储每个术语的行号。一些函数接受带注释的术语,而另一些则接受空的术语(将a
替换为 unit
), 如下所示:
myFunction :: Value Int -> ...
myFunction = ...
myOtherFunction :: Value () -> ...
myOtherFunction = ...
不过,我认为这个替代方案更加清晰易懂:
type Annotated b = b Int
type Bare b = b ()
然后,我可以像这样重新编写之前的两个函数:
myFunction :: Annotated Value -> ...
myFunction = ...
myOtherFunction :: Bare Value -> ...
myOtherFunction = ...
这个很好用,但我还需要为具有相同特性的列表类型定义一个同义词:
type MyList a = [Value a]
现在,我想定义一个函数,其参数类型为带注释的MyList
,如下所示:
myOtherOtherFunction :: Annotated MyList -> ...
myOtherOtherFunction = ...
然而,这并不起作用。错误消息显示:“类型同义词‘MyList’应该有1个参数,但却没有给出”。为什么会这样?有更好的定义这些类型的方法吗?也许可以使用某些扩展功能?