看起来并不像我想象的那么简单

时间:2013-04-09 02:27:13

标签: haskell

在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提供一个它可能是一个整数的变量一样简单。我做错了什么?

1 个答案:

答案 0 :(得分:5)

在第一种情况下,您从声明为返回Int的函数返回Val。根据您对Val的定义,您可能希望在此处返回Num integer

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