为什么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