0

在用 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 提供一个它可以计算为整数的变量一样简单。我究竟做错了什么?

4

1 回答 1

5

在第一种情况下,您Int从声明返回的函数返回 a Val。根据您的定义,Val您可能想回到Num integer这里。

在第二种情况下,问题在于模式匹配。(NumE 'a')是一个错误,因为NumE被定义为NumE Int,所以它后面必须跟一个Int,而不是一个Char

于 2013-04-09T02:41:38.887 回答