Haskell错误解析输入“ =”上的错误


111

我是Haskell的新手,开始ghci尝试后:

f x = 2 * x

我获得了:

<interactive>:1:4: parse error on input `='

我不明白。

奇怪的是,它以前运行良好。我想我做错了Haskell的配置。重新安装ghc6无法解决问题。

有关信息,我使用Ubuntu 10.4,ghc6的版本为6.12.1-12

Answers:


160

在GHCi 7.x或更低版本中,您需要let在其中定义内容。

Prelude> let f x = x * 2
Prelude> f 4
8

从GHC 8.0.1开始,GHCi支持顶级绑定,因此OP的代码可以正常使用。

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8

15
谢谢。“现实世界中的haskell”(至少是我拥有的版本)let在其示例中没有
米卡

43
“了解您的Haskell”一点都没有提及。
2013年

2
@Bakuriu LYAH 提现let。但要跟进。在LYAH我读addThree :: Int -> Int -> Int -> Int(新行) addThree x y z = x + y + z,但只在第二个运行GHCi使用let。为什么?
同构

9
@Bakuriu是的,但是作者告诉您将定义写入外部文件中并将其加载到GHCI中,而不是直接将其写入GHCI中。和前者完美地工作。
superzamp 2014年

然后,本教程完全是错误的:seas.upenn.edu/~cis194/lectures/01-intro.html。但这是haskell网站上推荐的第一个教程!
cammil 2015年

51

当您输入Haskell源文件时,

f x = 2 * x

是正确的。

当您直接在ghci中键入内容let时,您需要在该行的开头键入内容:

let f x = 2 * x

12
为什么它在GHCi中不起作用?为什么语法有所不同?
击败

1
@Beat GHCi尝试默认情况下评估表达式,而不是分析语句,而文件格式则相反。这就是为什么要声明(例如:设置变量,定义函数等),必须声明正在使用的原因let。将GHCi视为一项重要let ... in ...声明。
AJFarmar

20

使用ghci的一个好的经验法则是,您输入的任何代码都应符合do-block语义;也就是说,可以从句法上假设您正在IO monad中进行编程(如果这是新术语,请不用担心!我强烈建议您通读本教程)。

答案通过一个示例说明了这一点,并且可以提供有关IO和ghci性质的更多工作见解。


26
这个答案对初学者毫无用处。他正在寻找前进的简单可行提示,而不是高级主题。您不会向学习乘法表的孩子解释多项式乘积-它不会显示您知道多少,它表明您不知道如何分享自己知道的东西。
btk

3
@btk:每个人都必须在某个时候停止成为新手。我昨天开始学习Haskell,我相信在很短的时间内,我会理解Raeez所说的一切。
Vietnhi Phuvan 2014年

10
这是我学习Haskell的第一天,我发现此答案对于理解为什么必须使用它很有帮助let;我就像“ wtf,为什么我必须使用let”,然后我读了此书并被启发。
Brian Tingle 2014年

4

从GHC 8.0.1开始,它将不再产生错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.