如何使用 GHCi 更改 Haskell 中的源代码?

How to make a change to the source code in Haskell using GHCi?

我是 Haskell 的新手,正在使用 GHCi 编辑 运行 Haskell 文件。出于某种原因,我无法编辑文件的源代码。我得到的行为非常奇怪。

下面是正在发生的事情的屏幕截图。我正在加载文件 lec3.hs 并试图编辑此文件以添加以下功能:myfun = \w -> not w。出于某种原因,当我 立即 myfun False 之后调用它时,此函数成功 运行s。我不需要重新加载文件。

很明显该函数没有被添加到源代码中。当我重新加载文件时,我收到一条错误消息,指出 myfun 不存在。

谁能帮我理解为什么 GHCi 会这样,以及如何解决这种行为?我已经花了一个小时试图弄清楚这一点。如果有任何帮助,我将不胜感激。

回答

Is it possible to edit a .hs file from GHCi?

从技术上讲这是可能的,因为 Haskell 与任何其他语言一样具有 file-IO 操作。具体来说,appendFile 允许您向文件添加内容。

$ cat >> Foo.hs   # Creating a simple Haskell file
foo :: Int
foo = 3

$ ghci Foo.hs 
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/sagemuej/.ghc/ghci.conf
Loaded GHCi configuration from /home/sagemuej/.ghci
[1 of 1] Compiling Main             ( Foo.hs, interpreted )
Ok, one module loaded.
*Main> foo
3
*Main> appendFile "Foo.hs" $ "myfun = \w -> not w"
*Main> :r
[1 of 1] Compiling Main             ( Foo.hs, interpreted )
Ok, one module loaded.
*Main> myfun False
True

但这确实不是编辑文件的好方法。打开两个 windows 更有意义,一个带有文本编辑器,一个带有 REPL,即 GHCi。它可以是两个完全独立的 OS windows,也可以是 IDE 的两个 sub-windows 或其他任何东西,但在任何一种情况下,GHCi 都将仅用于评估和 one-line 原型设计,而不是实际 adding/editing 代码。 (如果有帮助,可以将 one-line 原型复制并粘贴到编辑器中。)

在 GHCi 中输入内容不应将它们添加到源代码中。但是如果你已经将文件加载到 GHCi 中,你可以使用 :e 命令编辑它,当你关闭编辑器时它会自动重新加载。

如果处理多个文件需要指定,可以使用:e filename.hs

通常,在单独的编辑器中工作更容易,只需使用 :r 重新加载到 GHCi 中,但 :e 偶尔会有用。