0

Haskell のクラスの宿題をしていて、インタープリターを作成しています。関数の最初のセットは、変数を評価することです。

evalE (Var x) s        = subEv (Map.lookup x s)
where subEv (Just a)   = a
      subEv (Nothing)  = (IntVal 0)
evalE (Val v) s       = v
evalE (Op o e1 e2) s  = (evalE e1 s) 'o' (evalE e2 s)

したがって、最初の 2 つのバージョンは正常に動作し、問題は 3 番目の evalE にあります。コンパイラは、とが引数として与えられている(evalE e1 s) 'o' (evalE e2 s)かのように解釈し続けますo(evalE e2 s)(evalE e1 s)

最初の閉じ括弧の存在を無視している理由がわかりません。また、haskell を初めて使用するので、その行のどこに構文エラーがあるかわかりません。しかし、それにもかかわらず、コンパイラはコンパイルせず、evalE への引数が多すぎると言います。ここから何かが完全に欠けていますか?

さらにテストすると、関数が呼び出される evalE のコード内のどこでも同じ問題が発生します (再帰的でない関数でさえ、 ')' を無視しているようです)。

4

1 に答える 1

5

これはo引数が 2 つの関数であり、中置演算子として使用したいと考えています。次に、一重引用符 (文字リテラル用) の代わりにバッククォートを使用する必要があります。

最後の句を次のように変更してみてください。

evalE (Op o e1 e2) s  = (evalE e1 s) `o` (evalE e2 s)

まとめ: 「パラメータとして文字andをfoo 'f' bar呼び出す」を意味し、「 andに適用する」を意味します。foo'f'barfoo `f` barffoobar

したがって、コンパイラの動作は完全に正しいものでした。

于 2013-02-02T00:36:48.323 に答える