Haskell,在输入`)和#x27;

Haskell,在输入`)和#x27;,haskell,Haskell,最后一行有个错误 parse error on input `)' 为什么呢 import Data.Maybe data Operator = Add | Sub | Mul | Div | And | Or | Not | Eq | Less | Great deriving (Eq, Show) data Expression = Literal Val | Primitive Operator [Expression] | Var Strin

最后一行有个错误

parse error on input `)'
为什么呢

import Data.Maybe 

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

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

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

evaluate e (Fun str ex) = (Closure str ex e) --40
evaluate e (Call ex exl) = let (Closure a b c) = (evaluate e ex) 
            in (Closure a b (c ++ (helper a (map (evaluate e) exl)))) 

helper :: [String] -> [Val] -> [(String, Val)]
helper (a:ar) (b:br) = (a, b) : helper ar br 

fromBoolean (Boolean b) = b
--48
main = do
    let x = Var "x"
        fun1 = Primitive Mul [(Var "x"), (Literal (Num 2))]
        fun2 = Primitive Mul [(Var "x"), (Literal (Num 5))]
        in print (evaluate [] (Call (if (Boolean true) (fun1) (fun2)) (Literal (Num 3)))) -- parse error on input `)'
导入数据。可能吧
数据运算符=Add | Sub | Mul | Div | And | Or | Not | Eq | Less | Great
推导(等式,显示)
数据表达式=文本值
|基元运算符[表达式]
|变量字符串
|如果表达式
|Let[(字符串,表达式)]表达式
|有趣的[字符串]表达式
|调用表达式[表达式]
推导(显示,等式)
数据Val=numint
|布尔布尔
|闭包[String]表达式环境
推导(等式,显示)
类型Env=[(字符串,Val)]
--20
prim::运算符->[Val]->Val
prim Add[Num a,Num b]=Num(a+b)
prim Mul[Num a,Num b]=Num(a*b)
prim Sub[Num a,Num b]=Num(a-b)
prim Div[Num a,Num b]=Num(a`Div`b)
prim和[Boolean a,Boolean b]=Boolean(a&&b)
prim或[布尔a,布尔b]=布尔(a | | b)
prim Not[Boolean a]=布尔(Not a)
基本等式[a,b]=布尔(a==b)
prim Less[Num a,Num b]=布尔值(ab)
--32
evaluate::Env->Expression->Val
计算e(文字v)=v
评估e(初始操作as)=初始操作(映射(评估e)as)
计算e(Var x)=fromJust(查找x e)
求值e(如果a b c)=求值e(如果是从布尔值(求值e a),则b为其他c)
求值e(设b)=求值([(x,求值ed)|(x,d)[Val]->[(字符串,Val)]
助手(a:ar)(b:br)=(a,b):助手ar-br
fromBoolean(布尔b)=b
--48
main=do
设x=Var“x”
fun1=Primitive Mul[(变量“x”),(Literal(Num 2))]
fun2=Primitive Mul[(变量“x”),(Literal(Num 5))]
在打印中(evaluate[](调用(if(Boolean true)(fun1)(fun2))(Literal(Num 3)))--parse error on input`)

在Haskell if、then和else中必须始终同时进行。在Haskell if、then和else中,您的问题行仅定义“if”

在Haskell if、then和else中必须始终同时进行。您的问题行仅定义“if”

您收到的确切错误消息是什么?
如果Haskell中的
需要
那么
else
关键字。而且您在该行中使用
是不正确的,即使它是正确的,也缩进得太远。太好了!!!再次感谢DuBuisson先生!!您收到的确切错误消息是什么?
如果在H中
askell需要
then
else
关键字。此外,您在该行中使用
是不正确的,即使是正确的,也缩进得太远。太好了!!!再次感谢DuBuisson先生!!非常感谢。:)非常感谢。:)