Haskell GHCI编译器:在定义和声明简单函数时,REPL解析错误。

3

我正在学习《Learn You A Haskell》这本书。

我试图定义一个简单的函数,但编译器却无法通过。可能是因为我完全不懂Haskell:

GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> doubleMe x = x + x

<interactive>:2:12: parse error on input `='

Prelude> (前奏符号)

1
你需要使用 let - let doubleMe x = x + x - Lee
1
他为什么没有在书中提到这个问题?这是ghci的新版本中的新功能吗? - user3248346
2个回答

4
如果你仔细阅读这本书,它会说(重点是我的):

Open up your favorite text editor and punch in this function that takes a number and multiplies it by two.

    doubleMe x = x + x  

这对于ghc来说没有问题,因为它可以理解这是一个函数声明(而且书上也没有告诉你在ghci中尝试它。事实上,不久之后它解释了如何使用let"在GHCI中定义一个名称。在GHCI中执行let a = 1相当于在脚本中编写a = 1,然后加载它。")。为了让ghci理解你正在定义一个函数,你需要使用let

Prelude> let doubleMe x = x + x
Prelude> doubleMe 10
20

注意:我在Haskell方面很无知,所以我实际上不知道为什么会有这样的差异。 - Shahbaz
1
@Shabaz - 这是因为ghci在IO单子中执行,所以您需要使用let来绑定非IO值。 - Lee
我不喜欢 Haskell 的一件事情就是 REPL。好像你必须在使用它之前学习所有种类的复杂特性。 - Evan Zamir
@EvanZamir,REPL实际上只是用于实验的。因此,一旦您掌握了基础知识并且想要快速测试某些功能的工作原理,您可以使用REPL。但如果您不使用它,您也不会错过太多。 - Shahbaz

1
在GHCi中,您可以使用let关键字绑定新的标识符。
> let doubleMe x = x + x
> doubleMe 3
> 6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接