在用 Haskell 为一种单独的、简单的编程语言编写解释器的过程中——当我学习用 Haskell 打字时,我发现自己的头撞到了墙上。
我有两种自定义数据类型
data Expr
= Var Var
| NumE Int
| NilE
| ConsE Expr Expr
| Plus Expr Expr
| Minus Expr Expr
| Times Expr Expr
| Div Expr Expr
| Equal Expr Expr
| Less Expr Expr
| Greater Expr Expr
| Not Expr
| Isnum Expr
| And Expr Expr
| Or Expr Expr
| Head Expr
| Tail Expr
| Call String
deriving (Show, Read)
data Val = Num Int | Nil | Cons Val Val
deriving (Eq, Show, Read)
我开始编写解释这些选项的案例,使用函数interpret_expr
interpret_expr :: Vars -> Expr -> Val
interpret_expr vars@(Vars a b c d) (NumE integer) = integer
但这抱怨它无法将表达式“整数”中的预期类型“Val”与实际类型“Int”匹配。但是说我把它改成愚蠢的东西
interpret_expr :: Vars -> Expr -> Val
interpret_expr vars@(Vars a b c d) (NumE 'a') = 'a'
然后它在“a”处抱怨它无法将预期类型“Int”与实际类型“Char”匹配。现在它想要一个INT??????我真的不知道该说什么,我真的认为这就像为 NumE 提供一个它可以计算为整数的变量一样简单。我究竟做错了什么?