0

これが私のADTです:

data Ex a = I Integer  --integer
           | Add (Ex a) (Ex a) --add 
           | Variable a --variable
           | Def [(a, Ex a)] (Ex a) --defining local variables

そして、これが私の評価関数です:

eval :: Ex a -> Integer
eval (I n) = n
eval (Add e1 e2) = eval e1 + eval e2

どうすれば続行できますevalか?VariableDef

4

2 に答える 2

1

ヒントは次のとおりです。

eval :: Ex a -> Integer
eval = eval' []
  where eval' :: [(a, Integer)] -> Ex a -> Integer
        eval' _ (I n) = n
        -- etc
于 2012-10-17T09:56:55.263 に答える
1

ソリューションを自分で作成するのに役立つヒントがいくつかあります。

いくつかの提案

  • lookupタイプのリストで実行する必要があるため、それに対する制約が[(a,Ex a)]必要です。Eq a
  • ローカル変数を定義して使用していない場合、評価が失敗する可能性があります。その場合、eval関数はそれ以外の場合に戻る必要がありNothingますJust answer
  • 私はあなたのコードの大部分を書きました。あなたが書く必要がある唯一の場所はVariable aケースのためです。これは非常に簡単です。他に成功した場合に評価した後、値を入力して返すlookup必要があるからです。xslookupNothing

コードは次のようになります

eval :: Eq a => Ex a -> Maybe Integer
eval = eval' []
  where eval' :: Eq a => [(a, Ex a)] -> Ex a -> Maybe Integer
        eval' _ (I n) = Just n
        eval' xs (Add e1 e2) = liftA2 (+) (eval' xs e1) (eval' xs e2) -- liftA2 from Control.Applicative
        eval' xs (Variable a) = -- write your code here
        eval' xs (Def ys e) = eval' (ys ++ xs) e -- Think of the order in which you want to combine two binding if same named variable is present in both xs and ys.
于 2012-10-17T11:41:05.633 に答える