在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提供一个它可能是一个整数的变量一样简单。我做错了什么?
答案 0 :(得分:5)
在第一种情况下,您从声明为返回Int
的函数返回Val
。根据您对Val
的定义,您可能希望在此处返回Num integer
。
在第二种情况下,问题在于模式匹配。 (NumE 'a')
是一个错误,因为NumE
定义为NumE Int
,因此必须后跟Int
,而不是Char
。