2013-02-12 106 views
1

大家。 我對Haskell相當新。Haskell,解析錯誤

我得到這個縮進錯誤,但我不知道爲什麼我得到它。 我指出從哪條線我收到此錯誤的評論。

如果你能幫我糾正我的「func」和「call」,我將不勝感激。

import Data.Maybe 

data Operator = Add | Sub | Mul | Div | And | Or | Not | Eq | Less | Great 
    deriving (Eq, Show) 
data Expression = Literal Val 
      | Prim Operator [Expression] 
      | Variable String 
      | If Expression Expression Expression 
      | Let [(String, Expression)] Expression 
     | Func [String] Expression 
     | Call Expression [Expression] 
    deriving (Show, Eq) 

data Val = Num Int 
      | Bool Bool 
     | Closure [String] Expression Environment 
    deriving (Eq, Show) 

type Environment = [(String, Val)] 
--20 
primitive :: Operator -> [Val] -> Val 
primitive Add [Num a, Num b] = Num (a+b) 
primitive Mul [Num a, Num b] = Num (a*b) 
primitive Sub [Num a, Num b] = Num (a-b) 
primitive Div [Num a, Num b] = Num (a `div` b) 
primitive And [Bool a, Bool b] = Bool (a && b) 
primitive Or [Bool a, Bool b] = Bool (a || b) 
primitive Not [Bool a] = Bool (not a) 
primitive Eq [a, b] = Bool (a == b) 
primitive Less [Num a, Num b] = Bool (a < b) 
primitive Great [Num a, Num b] = Bool (a > b) 
--32 
evaluate :: Environment -> Expression -> Val 
evaluate e (Literal v) = v 
evaluate e (Prim op as) = primitive op (map (evaluate e) as) 
evaluate e (Variable x) = fromJust (lookup x e) 
evaluate e (If a b c) = evaluate e (if fromBool (evaluate e a) then b else c) 
evaluate e (Let bp b) = evaluate ([(x, evaluate e d) | (x,d) <- bp ] ++ e) b 

evaluate e (Func str ex) = str ex e 
evaluate e (Call ex exl) = [[a, b, C++ (map (evaluate e) exl)] | (a, b, c)<-(evaluate e ex)] --41 
--42 
fromBool (Bool b) = b 

main = do 
    let x = Variable "x" 
     func1 = x*2 -- this is where I am getting a "parse error (possibly incorrect indentation)" 
     func2 = x*5 
    in print(evaluate [("r",Num 7)] (Call (If (Bool True) func1 func2) [Num 5])) 
+9

'let Int x'應該是什麼意思? – bereal 2013-02-12 07:21:11

+1

我們可以告訴你,這不是一個縮進錯誤。如果有的話,請經常觀察可能的**小字。還有一個提示:第n行標記的語法錯誤不必在第n行。它可能是n之前的任何一行。 – Ingo 2013-02-12 07:33:01

回答

3

你有幾個問題與您的代碼。首先,let Int x是錯誤的。 let的語法是let value = expression in expression(或value = expression的列表)。您的Int x與此語法不匹配。這就是編譯器使其報告縮進錯誤的原因。

此外,您在最後一行使用了fun1fun2,即使它們不在範圍內。