2013-02-02 60 views
0

我收到这个错误,我不知道我在做什么错。 我是Haskell的新手,所以请为我详细阐述一切。Haskell:解析错误的输入'='

import Data.Maybe 

data Op = Add | Sub | Mul | Div | And | Or | Not | Eq | Less | Great 
    deriving (Eq, Show) 

data Exp = Literal Value 
    | Primitive Op [Exp] 
    | Variable String 
    | If Exp Exp Exp 
    | Let [(String, Exp)] Exp 
    deriving (Show, Eq) 

data Value = Number Int 
     | Bool Bool 
     | String String 
    deriving (Eq, Show) 

type Env = [(String, Value)] 

eval :: Env -> Exp -> Value 
eval e (Literal v) = v 
eval e (Variable x) = fromJust (lookup x e) --22 

prim :: Op -> [Value] -> Value 
prim Add [Number a, Number b] = Number (a + b) 
prim And [Bool a, Bool b] = Bool (a && b) 
prim Sub [Number a, Number b] = Number (a - b) 
prim Mul [Number a, Number b] = Number (a * b) 
prim Div [Number a, Number b] = Number (a `div` b) 
prim Or [Bool a, Bool b] = Bool (a || b) 
prim Not [Bool a] = Bool (not a) 
prim Eq [Number a, Number b] = Bool (a == b) 
prim Eq [String a, String b] = Bool (a == b) 
prim Less [Number a, Number b] = Bool (a < b) 
prim Less [String a, String b] = Bool (a < b) 
prim Great [Number a, Number b] = Bool (a > b) 
prim Great [String a, String b] = Bool (a > b) --37 

main = do 
    n = "n" -- parse error on input `=' 
    nv = Variable "n" -- parse error on input `=' 
    lit n = Literal (Number n) 

    t0 = Primitive Mul [lit 5, lit 2]  
    t1 = Let [(n, t0)] (If (Primitive Great [nv, lit 9]) (lit 1) (lit 0)) -- parse error on input `=' 

我在评论中写道我得到的错误。 我检查了参数的有效性,并且一切看起来都很好。这可能是我的语法错误...我想。

预先感谢您。

+1

请不要编辑问题以删除答案依赖的部分。 – Abizern

回答

4

您的主要功能几乎在各个方面都被打破。你是否学过单子或者仅仅是关于IO monad的情况?

main :: IO Exp 
main = do 
    let n = "n" 
     nv = Variable "n" 
     lit n = Literal (Number n) 
     t0 = Primitive Mul [lit 5, lit 2] 
     in return $ Let [(n, t0)] (If (Primitive Great [nv, lit 9]) (lit 1) (lit 0)) 

您不能只在该do-Block的上下文中使用=。 此版本按预期工作。了解let表达式和return。如果您不知道这一点,请阅读例如here

+0

谢谢你的帮助。它现在符合,但它不计算。它应该给我一个价值。 – Nayana

+0

在我的主要中,我尝试这个“eval [(”y“,(N​​umber 40))](Let [(”x“,(Literal(Number 2)))](Primitive Add [(Variable”x“)) ,(变量“y”)]))“这应该是42.但它给了我这个错误”无法匹配预期类型'IO t0'与实际类型'价值'“你知道我可能会失踪? – Nayana

+0

你没有告诉它做。你的初始代码不包含任何对你的'eval'函数的引用。 – Secoe