如何在GHCi中抑制“失败,加载模块:”?

时间:2012-07-16 17:12:25

标签: haskell ghci

在重构大型项目时,我喜欢通过引入所需的更改让类型检查器为我做的工作,然后跟踪生成的类型错误。

但是,由于相关的类型错误在 Failed, modules loaded:输出之前显示在GHCi 中,因此具有足够模块的项目可能会导致相关错误滚动到顶部 - 即使是慷慨地 - 大小的终端。

是否有一个标志或选项让GHCi抑制此输出,或者至少重新排序以使错误出现在最后?

3 个答案:

答案 0 :(得分:1)

您可以尝试使用GHC编译文件,而不是在GHCi中加载它们。这样,它不会尝试加载文件,只会编译它们,因此只显示编译错误和警告。

所以,而不是:

$ ghci -Wall -Werror
GHCi, version 7.4.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l foo.hs

......就这样做:

$ ghc -Wall -Werror foo.hs

顺便说一句,如果您在UNIX / Linux中使用终端,则可以更轻松地更改字体大小,水平调整终端大小(在Windows上默认运行终端时无法完成),增加向后滚动,否则增加你可以看到的行数:)

答案 1 :(得分:1)

我非常绝望,我在代码中挖了一遍:

modulesLoadedMsg :: SuccessFlag -> [GHC.ModSummary] -> InputT GHCi ()
modulesLoadedMsg ok mods = do
  dflags <- getDynFlags
  unqual <- GHC.getPrintUnqual
  let mod_name mod = do
        is_interpreted <- GHC.isModuleInterpreted mod
        return $ if is_interpreted
                  then ppr (GHC.ms_mod mod)
                  else ppr (GHC.ms_mod mod)
                       <> text " ("
                       <> text (normalise $ msObjFilePath mod)
                       <> text ")" -- fix #9887
  mod_names <- mapM mod_name mods
  let mod_commas
        | null mods = text "none."
        | otherwise = hsep (punctuate comma mod_names) <> text "."
      status = case ok of
                   Failed    -> text "Failed"
                   Succeeded -> text "Ok"

      msg = status <> text ", modules loaded:" <+> mod_commas

  when (verbosity dflags > 0) $
     liftIO $ putStrLn $ showSDocForUser dflags unqual msg

看起来0的详细程度将其关闭。您可以设置:

$ ghci -v0

或与cabal:

$ cabal repl --ghc-options="-v0"

或堆叠:

$ stack repl --ghci-options="-v0"

答案 2 :(得分:0)

sed解决方法是一个好主意,除了sed也接收Ctrl + c,打破了管道。这是一个解决该问题的变体:

cabal new-repl cabal-install | (trap '' SIGINT; sed -e '/Failed, modules loaded.*/d')

(用你最喜欢的GHCi命令替换cabal new-repl。)