Haskell:在WinGHCi中卸载模块

Haskell : unload module in WinGHCi

提问人:artella 提问时间:4/24/2012 最后编辑:Communityartella 更新时间:4/25/2012 访问量:7232

问:

我加载了两个模块(NecessaryModule1.hs 和 NecessaryModule2.hs 在 Haskell 中外链:加载当前目录路径中的所有文件)。现在我想卸载 NecessaryModule2.hs。但是,我在System.Plugins.Load中找到了一个“卸载”函数,但它在WinGHCi中不起作用。我得到的错误消息是:

>unload NecessaryModule2

<interactive>:1:1: Not in scope: `unload'

<interactive>:1:8:
    Not in scope: data constructor `NecessaryModule2'

我试过了

import System.Plugins.Load

但这没有用。有没有办法以上述方式卸载模块?

---------------------------------------------------------------------------------------

[对里卡多的回应]

嗨,Riccardo,我尝试了您的建议,但我无法让它在 WinGHCi 中工作。我有一个文件NecessaryModule1.hs,如下所示:

module NecessaryModule1 where

addNumber1 :: Int -> Int -> Int
addNumber1 a b = a + b

我通过“:cd”命令转到文件的位置,然后执行:

> :module +NecessaryModule1

<no location info>:
    Could not find module `NecessaryModule1':
      it is not a module in the current program, or in any known package.

这是正确的吗?谢谢 [编辑:请参阅下面的更正]

---------------------------------------------------------------------------------------

[对上述内容的更正]

只是为了解释为什么上面是不正确的(正如 Riccardo 所解释的那样),需要做的是以下几点:

如果我们有一个文件NecessaryModule1.hs,如下所示:

--NecessaryModule1.hs
module NecessaryModule1 where

addNumber1 :: Int -> Int -> Int
addNumber1 a b = a + b

然后我们做:

> :load NecessaryModule1
[1 of 1] Compiling NecessaryModule1 ( NecessaryModule1.hs, interpreted )
Ok, modules loaded: NecessaryModule1.
> addNumber1 4 5
9
> :module -NecessaryModule1
> addNumber1 4 5

<interactive>:1:1: Not in scope: `addNumber1'
Haskell GHC GHCI 翼HCI

评论


答:

17赞 Riccardo T. 4/24/2012 #1

已安装的模块

您必须使用 ghci 的命令才能加载 () 和卸载 () 已安装的模块。你也可以使用 instead of 来减少写作量,如下所示::module +My.Module:module -My.Module:m:module

Prelude> :m +Data.List
Prelude Data.List> sort [3,1,2]
[1,2,3]
Prelude Data.List> :m -Data.List
Prelude> sort [3,1,2]

<interactive>:1:1: Not in scope: `sort'

请记住,ghci 提示符总是会提醒您当前导入的模块:您可以查看该模块以了解要卸载的内容。:m -Module.To.Unload

特定文件

如果您尝试加载的模块未安装在系统中(例如,您编写了源代码并简单地将文件保存在某处),则需要使用其他命令 .更快的方法是将文件的路径直接作为命令行参数传递给 ,例如 。如果运行并将其关联到扩展,只需双击该文件即可。:load filename.hsghcighci filename.hswinghci.hs

在这两种情况下,您都会收到一个 ghci 提示符,其中指定的模块已正确加载并导入到范围内(前提是您没有获取编译错误)。和以前一样,您现在可以用来加载和卸载模块,但请注意,这与假设您已经尝试进入/退出范围的内容不同。:m [+/-] My.Module:load:module:load

例如,如果您有test.hs

module MyModule where
import Data.List

f x = sort x

您可以通过双击它(在带有 winghci 的 Windows 上)、在控制台中键入或加载和键入(注意相对/绝对路径)来加载它。ghci test.hsghci:load test.hs

另一个有用的 ghci 命令是 ,它将重新编译您之前加载的模块。当您更改源文件并希望快速更新 ghci 中加载的模块时,请使用它。:reload

Prelude> :load test.hs
[1 of 1] Compiling MyModule         ( test.hs, interpreted )
Ok, modules loaded: MyModule.
*MyModule> let xs = [1,2,3] in sort xs == f xs
True
*MyModule> :reload
Ok, modules loaded: MyModule.

:help将为您提供所有可用命令的完整列表。

评论

0赞 artella 4/24/2012
嗨,里卡多,我尝试了你的建议,但遇到了一些问题。我在上面发帖,因为这里的空间太少了。谢谢
0赞 artella 4/25/2012
嗨,里卡多,非常感谢您解释清楚的答案。我真的很感谢你花时间把所有这些写下来。谢谢。
0赞 chtenb 5/7/2021
:m -Data.List有效,但不适用于 Prelude。有什么方法可以卸载前奏曲吗?