0

このエラーが発生していますが、何が間違っているのかわかりません。私は 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 `='

エラーが発生している場所にコメントを書きました。パラメータの有効性を確認しましたが、すべて問題ないようです。それはおそらく私の構文のエラーです...私は推測します。

前もって感謝します。

4

1 に答える 1

4

あなたの主な機能は、ほとんどすべての点で壊れています。モナドを学んだことがありますか、それともこの場合は IO モナドについてだけですか?

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ます。これがわからない場合は、たとえばここを読んでください。

于 2013-02-02T02:02:13.747 に答える