如何从 GHCi 中的 "target list" 中删除模块

How to remove module from "target list" in GHCi

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

如果您不小心使用 :add 而不是 :module + 来尝试加载模块,以后的重新加载总是会失败,并显示一条错误消息,指出该模块是包模块而不是源模块。如何删除模块以便重新加载可以再次成功使用,而无需通过 :load?

重置整个源模块列表

不幸的是,: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.