haskell - 使用 ghci 7.6.3,:}\n results in an error of "unknown command"

标签 haskell ghci

我有时会遇到此错误,但并非总是如此,这让我发疯。我不知道这是否是一个错误,或者是否有一些我不知道的行为或修复。

我使用 :{ 和 :} 输入多行命令,有时当我想结束该命令时,如下所示,我会收到如下所示的错误:

*MyModule| :}
unknown command ':}'
use :? for help.

我想说它在 97% 的情况下都能正常工作,但只有 3% 的情况下我会遇到这种情况。

据我所知,应该始终可以输入 :} 来关闭多行条目,如下所述:

http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/interactive-evaluation.html

目前,我知道在这种情况发生时摆脱这种情况的唯一方法是 ctrl+D,不幸的是,这会杀死 ghci。

A.这是一个错误还是有某种原因导致 :} 突然变成“未知命令”?

B.如果我遇到这种情况,有没有办法在不使用 ctrl+D 的情况下恢复?无论我尝试多少次:},一旦我进入这种情况,它总是会导致“未知命令”,尽管我期望此命令关闭多行条目。

就像问题中所说的那样,这是 Arch Linux 上的 GHCi 版本 7.6.3。

最佳答案

正如我在评论中已经指出的,出现此行为的原因是按下 Ctrl-C 时 GHCi 无法正确重置提示。问题的根源可能在于以下代码(摘自ghci-ng):

multiLineCmd q = do
  st <- lift getGHCiState
  let p = prompt st
  lift $ setGHCiState st{ prompt = prompt2 st }
  mb_cmd <- collectCommand q ""
  lift $ getGHCiState >>= \st' -> setGHCiState st'{ prompt = p }
  return mb_cmd

(参见 InteractiveUI.hs line 712 )

如果collectCommand抛出UserInterrupt,那么重置promt的行将永远不会被执行。我将此代码更改为:

multiLineCmd q = do
  st <- lift getGHCiState
  let p = prompt st
  lift $ setGHCiState st{ prompt = prompt2 st }
  mb_cmd <- collectCommand q "" `GHC.gfinally` lift (getGHCiState >>= \st' -> setGHCiState st'{ prompt = p })
  return mb_cmd

这解决了问题。

关于haskell - 使用 ghci 7.6.3,:}\n results in an error of "unknown command",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20888797/

相关文章:

haskell - 更改用于在 GHCi 中运行 "shell commands"的 shell

haskell - 在 Haskell 中使用 Data.Mod 进行模幂运算

具有递归类型的 Haskell AST

haskell - 缺少实例错误、模块加载和 GHCi

haskell - 如何在 ghci 中终止套接字服务器?

Haskell:数据类型

haskell - 将 monadic 函数转换为 IO monadic 函数

haskell - 使用类型类 Ord 的方法进行无限循环

haskell - Happy 中的 %% 是什么意思?

haskell - 使用类型同义词的函数定义是 "less polymorphic than expected"