2013-02-02 23 views
0

我正在做一個關於haskell的類的作業,我們正在構建一個解釋器。第一組的職能是評估的變量,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) 

因此,前兩個版本的做工精細,問題是在第三evalE,編譯器不斷解釋(evalE e1 s) 'o' (evalE e2 s)彷彿o(evalE e2 s)都報錯參數(evalE e1 s)

我不明白爲什麼它忽略了第一個右括號的存在,而我是haskell的新手,所以我看不到其中的語法錯誤在哪裏。但不管怎樣,編譯器都不會編譯,並且說evalE有太多爭論,而且我快速失去耐心,因爲它看起來似乎沒有任何錯誤。我完全錯過了從這裏的東西?

在進一步的測試,同樣的問題出現在任何地方爲evalE的代碼調用函數時(即使函數沒有被遞歸似乎忽略「)」)

+0

請不要忽略語法的「haskell」,但你的編譯器,它是... ghc?擁抱? NHC? YHC? - 無論如何,「a b c」的意思是「將函數a應用於參數b和c」(在您的情況下,「a」是表達式的結果)。 – scravy

回答

5

內我認爲o是兩-argument函數,並且您想將其用作中綴運算符。那麼你必須使用反引號而不是單引號(這是字符文字)。

試圖改變你的最後一句話如下:

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

爲了結束:foo 'f' bar的意思是「叫foo與性格'f'bar作爲參數」,而foo `f` bar意思是「適用ffoobar」 。

所以編譯器的行爲是完全正確的。

+0

謝謝你,那個作品,我沒有意識到他們需要反駁,我的壞哈哈。 – user2034298