如何使用 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
偶尔会有用。
我是 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
偶尔会有用。