我正在尝试在 Haskell 中实现表达式树,如下所示:
data ExprTr a b =
Variable a
| Constant b
| Add (ExprTr a b) (ExprTr a b)
| Mul (ExprTr a b) (ExprTr a b)
deriving (Eq, Show)
我希望能够使用变态对其进行操作。
目前,这是我得到的功能:
cataTr f _ _ _ (Variable i) = f i
cataTr f g _ _ (Constant i) = g i
cataTr f g h i (Add e1 e2) = g (cataTr f g h i e1) (cataTr f g h i e2)
cataTr f g h i (Mul e1 e2) = h (cataTr f g h i e1) (cataTr f g h i e2)
但是,每当我尝试将它与类型表达式一起使用时,都会ExprTr String Integer
出现编译器错误。例如,运行cataTr id id id id (Var "X")
返回以下编译器错误,而不是(Var "X")
.
Couldn't match type 'Integer' with '[Char]'
Expected type: 'ExprTr String String'
Actual type: 'ExprTr String Integer'
我不确定如何进行。此外,我将不胜感激有关如何键入诸如 cataTr 之类的函数以使其以后更易于调试的一些建议。
由于我对 Haskell 还很陌生,我想了解如何从“第一原则”处理这种情况,而不是使用库为自己生成 catamorphism。