Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何使用GHCi更改Haskell中的源代码?_Macos_Haskell_Terminal_Ghci - Fatal编程技术网

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

Macos 如何使用GHCi更改Haskell中的源代码?,macos,haskell,terminal,ghci,Macos,Haskell,Terminal,Ghci,我是Haskell的新手,正在使用GHCi编辑和运行Haskell文件。由于某些原因,我无法编辑该文件的源代码。我现在的行为非常奇怪 下面是正在发生的事情的屏幕截图。我正在加载文件lec3.hs,并试图编辑此文件以添加以下函数:myfun=\w->not w。出于某种原因,当我在以下时间后立即调用该函数时,该函数成功运行:myfun False。我不需要重新加载文件 很明显,该函数没有添加到源代码中。重新加载文件时,我收到一个错误,指出myfun不存在 有人能帮我理解为什么GHCi会这样做,以及

我是Haskell的新手,正在使用GHCi编辑和运行Haskell文件。由于某些原因,我无法编辑该文件的源代码。我现在的行为非常奇怪

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

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

有人能帮我理解为什么GHCi会这样做,以及如何纠正这种行为吗?我已经花了一个小时试图弄明白这一点。我将真诚地感谢任何帮助

回答

是否可以从GHCi编辑.hs文件

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

$ 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

但这确实不是编辑文件的好方法。打开两个窗口更有意义,一个窗口带有文本编辑器,另一个窗口带有REPL,即GHCi。它可以是两个完全独立的操作系统窗口,也可以是IDE的两个子窗口,但在任何一种情况下,GHCi都将仅用于评估和单行原型设计,而不是实际添加/编辑代码。(如果有帮助的话,可以将单行原型复制粘贴到编辑器中。)

在GHCi中键入内容不应将其添加到源代码中。但是,如果您已将文件加载到GHCi中,则可以使用
:e
命令对其进行编辑,当您关闭编辑器时,它将自动重新加载

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


一般来说,在单独的编辑器中使用
:r
重新加载到GHCi中更容易,但是
:e
偶尔有用。

在GHCi中定义内容不会产生将该内容添加到代码文件的效果。从来没有。如果您想将函数添加到代码文件中,只需在文本编辑器中打开它并进行编辑。谢谢您的评论,Fyodor。可以从GHCi编辑一个.hs文件吗?当然可以。您可以用Haskell编写一个小程序,打开文件,将文本写入其中,然后关闭它。如果您在GHCi中键入该程序并运行它,您将已从GHCi编辑了代码文件。但这绝对不是它的初衷。太好了,有道理——谢谢!