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

问题描述

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

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

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

有人可以帮助我了解GHCi为什么采用这种方式,以及如何解决这种行为吗?我已经花了一个小时试图解决这个问题。衷心感谢您的帮助。

Image of GHCi prompts

解决方法

回答

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

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

<NavLink
to={item.route}
activeClassName={classes.activeItem}
onClick={e => handleItemClick(e,key)}
isActive={(match,location) => {
         // remove last part of path ( admin/customer/list becomes admin/customer for example )
         const pathWithoutLastPart = location.pathname.slice(0,location.pathname.lastIndexOf("/"));
              // if current parent is matched and doesn't contain childs activate it 
              if (item.items.length === 0 && match) {
                return true;
              } 
              // if sliced path matches parent path 
              in case of customer item it becomes true ( admin/customer === admin/customer )
              else if (pathWithoutLastPart === item.route) {
                return true;
              } 
              // else inactive item
              else {
                return false;
              }
            }}
          >
...
</NavLink>

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

,

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

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

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