如何从GHCi中的“目标列表”中删除模块

时间:2016-03-21 18:35:21

标签: haskell ghci

在GHCI中,您可以使用:add module从当前项目添加模块,也可以使用:module + module将模块添加到当前范围。使用:add时加载的模块将在您使用:reload命令时自动重新加载,但必须是源模块,并且不能来自外部程序包。

如果您不小心使用:add而不是:module +来尝试加载模块,则将来的重新加载始终会失败,并显示模块是包模块而不是源模块的错误消息。如何删除模块以便可以再次成功使用重新加载,而无需通过:load重置整个源模块列表?

1 个答案:

答案 0 :(得分:2)

不幸的是,:load(或:cd)是摆脱目标列表的唯一方法。更改目标列表的唯一其他功能是:add,如您所知,只会添加其他目标。

然而,judging by the source,修复不应该那么难。如果您愿意重新编译GHC,那么这样的事情应该有效:

ghciCommands :: [Command]
ghciCommands = map mkCmd [
  ...
  ("rem",       keepGoingPaths removeModule,   completeFilename),
  ...

-- | @:rem@ command
removeModule :: [FilePath] -> InputT GHCi ()
removeModule files = do
  lift revertCAFs
  files'  <- mapM expandPath files
  targets <- mapM (\m -> GHC.guessTarget m Nothing) files'
  mapM_ GHC.removeTarget targets
  _ <- doLoadAndCollectInfo False LoadAllTargets
  return ()

话虽如此,我还没有尝试过。此外,这可能值ticket on the official tracker