在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)
Run Code Online (Sandbox Code Playgroud)
我开始用函数interpret_expr编写用于解释这些选项的案例
interpret_expr :: Vars -> Expr -> Val
interpret_expr vars@(Vars a b c d) (NumE integer) = integer
Run Code Online (Sandbox Code Playgroud)
但是这个COMPLAINS它无法将预期类型'Val'与表达式'integer'中的实际类型'Int'匹配.但是说我把它变成了傻逼的东西
interpret_expr :: Vars -> Expr -> Val
interpret_expr vars@(Vars a b c d) (NumE 'a') = 'a'
Run Code Online (Sandbox Code Playgroud)
然后它在'a'处抱怨它不能将预期类型'Int'与实际类型'Char'匹配.现在它想要INT ?????? 我真的不知道该说什么,我真的认为这就像为NumE提供一个它可能是一个整数的变量一样简单.我究竟做错了什么?
在第一种情况下,您Int将从声明为返回a的函数返回一个Val.从你的定义Val看起来你可能想回到Num integer这里.
在第二种情况下,问题在于模式匹配.(NumE 'a')是一个错误,因为NumE被定义为NumE Int,所以它必须后跟一个Int,而不是一个Char.