爲什麼Haskell解釋器(GHCI 7.10.3)需要函數定義在let表達式中,但Haskell編譯器(GHC 7.10.3)會拋出解析器錯誤函數定義在let表達式內?編譯vs解釋:允許還是不允許
我正在通過「Learn You a Haskell for Great Good!」嬰兒的第一個功能是doubleMe: doubleMe x = x + x
爲什麼解釋器接受這個定義,如果它在let表達式內,否則在輸入'='上拋出一個解析錯誤?同時,如果我從文件編譯相同的函數,爲什麼GHC在函數定義在let表達式內時拋出解析錯誤,並且如果它不在let表達式內編譯定義?來自Lisp背景,我很驚訝交互Haskell和文件加載和編譯Haskell對待這些定義的方式不同。
這是一個慣例。如果GHCi的工作與.hs文件完全相同,那麼寫'1 + 1'將是一個錯誤,以及'print(2,3)'。相反,GCHi選擇使用一點魔法來接受這些表達式和'let'定義。關於爲什麼'x = 1'沒有讓我被拒絕 - 我不認爲有一個明確的答案,除了「它需要更多的魔法」。 – chi
對。 FWIW,[IHaskell](https://github.com/gibiansky/IHaskell)允許混合兩種風格。 – leftaroundabout
最新版本的GHCi(8.0.1)接受'doubleMe x = x + x'。像你這樣的人抱怨他們爲此增加了一個特例。 :) – Alec