0

私はその任務に取り組んでいます。なぜこのエラーが発生するのかわかりません。

エラーの原因となった行をコメントで示しました。

そして、もし可能なら(そうする必要はありません)、私funccall関数は機能しているとは思いません。

import Data.Maybe 

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

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

type Environment = [(String, Value)]
--20
prim :: Operator -> [Value] -> Value
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 [Bool a, Bool b] = Bool (a && b)
prim Or [Bool a, Bool b] = Bool (a || b)
prim Not [Bool a] = Bool (not a)
prim Eq [a, b] = Bool (a == b)
prim Less [Num a, Num b] = Bool (a < b)
prim Great [Num a, Num b] = Bool (a > b)
--32
evaluate :: Environment -> Expression -> Value
evaluate e (Lit v)  = v
evaluate e (Prim op as) = prim 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 bs b)   = evaluate ([(x, evaluate e d) | (x,d) <- bs ] ++ e) b

eval e (Func 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] -> [Expression] -> [(String, Expression)]
helper (a:ar) (b:br) = (a, b) : helper ar br 

fromBool (Bool b) = b
--48
main = do
  let m = "m"
      k = Variable "k"  -- parse error on input `='
      y = Variable "y"
      lit m = Lit (Num m)
      a0 = Func [“k”] (Prim Mul [k, lit 2))
      in return $ Let [(“y”, a0)] (Prim Add [Call y [lit 3], Call y [lit 10]]) 
-- This is basically Let y = func(k) k*2 in y(3) + y(10) which returns 26.
4

1 に答える 1

5
  • 40行目は、そうでない場合は、関数の定義を、という名前の別個の無関係な関数で分割しているevalはずです。evaluateevaluateeval

  • 54、55行目。いくつかのUnicode方向引用符を使用していますが、ASCiiを使用する必要があります"

  • 54行目では、角かっこ「]」が必要な場合に「)」を使用しています。

  • helperはタイプが正しくなく、そのタイピングは抽象化を壊します。正しくするには、に変更Expressionする必要Valueがありますが、抽象化を維持するには、結果をに変更する必要がありますEnvironment

編集:

私が言ったように、私はヘルパーの型署名を次のように変更しました:

helper :: [String] -> [Value] -> [(String, Value)]

EDiT2:

編集したコードにコメントします。55行目を誤って左の親を削除しました。

Let ["y", a0)]  -- should be Let [("y", a0)]

そしてその前の行で、構文エラーがあったリストを修正しようとしました[ ... )が、間違ったブラケットを変更した結果( ...)、正しい代わりになりました[...]

具体的には:

[k, lit 2]
于 2013-02-13T02:55:09.210 に答える