【发布时间】:2017-02-26 16:19:33
【问题描述】:
为什么 Haskell 解释器 (GHCI 7.10.3) 需要函数定义在 let 表达式中,但如果函数定义在 let 表达式中,Haskell 编译器 (GHC 7.10.3) 会抛出解析器错误?
我正在处理“Learn You a Haskell for Great Good!” Baby的第一个函数是doubleMe: 双我 x = x + x
为什么解释器在 let 表达式中接受这个定义,否则在输入 '=' 上抛出解析错误?同时,如果我从文件中编译相同的函数,如果函数定义在 let 表达式中,为什么 GHC 会抛出解析错误,而如果它不在 let 表达式中,则编译定义?来自 Lisp 背景,我对交互式 Haskell 以及文件加载和编译 Haskell 以不同方式处理这些定义感到惊讶。
【问题讨论】:
-
这是一个约定。如果 GHCi 的工作方式与写入 .hs 文件完全相同,那么写入
1+1和print (2,3)将是一个错误。相反,GCHi 选择使用一点魔法来接受这些表达式和let定义。关于为什么不带 let 的x=1会被拒绝——我认为除了“它需要更多魔法”之外,没有明确的答案。 -
对。 FWIW,IHaskell 允许混合两种样式。
-
最新版本的 GHCi (8.0.1) 接受
doubleMe x = x + x。像你这样的人抱怨他们为此添加了一个特殊情况。 :) -
这是我现在欣赏 Haskell 和 Lisp 之间的根本区别:分别通过命令提示符对编译器进行交互式访问与通过 REPL 对语言本身进行交互式访问。
标签: haskell compilation ghci interpretation