有没有一种简单的方法可以从 GHCi 中访问 REPL 历史记录(例如作为列表)?

Is there a simple way to access the REPL history (e.g. as a list) from within GHCi?

其他 REPL e.g. Octave 具有专门用于浏览命令历史记录的命令。我发现这非常方便(尽管每当我使用这样的功能时我都会问自己,为什么我没有首先在文件中正确定义该命令?)。

GHCi 似乎没有这样的功能,而且我认为它可能不应该——这样的交互性会使像从 Emacs 控制这样的努力变得比现在更麻烦。

但是,简单地获取 整个历史记录 ,然后使用普通的 Haskell 浏览它,这听起来像是一项相当微不足道的任务。有没有在任何地方实施过类似的东西?

可能有一种更好的方法可以做到这一点,它是一种更跨平台的方法,可以开发成一个漂亮的小包来加载到 .ghci 文件或其他东西中,但是使用 haskeline 的快速而肮脏的方法很简单。您可以只读入您系统的 ghci_history 文件,我的位于 C:/Users/bheklilr/AppData/Roaming/ghc/ghci_history,但我相信在 *nix 系统上它应该位于 ~/.ghci_history。选择适合您系统的那个。

> import System.Console.Haskeline.History
> hist <- fmap $ readHistory "path/to/ghci_history"
> putStrLn $ unlines hist

不幸的是,至少对我来说,历史文件似乎在 GHCi 退出之前不会更新,因此对于特定会话 hist 应该是相同的(前提是您只有一个 GHCi 实例)。在我看来,这是一个非常有限的 API,我认为转储每个命令或至少每对命令的历史记录不会太难,但这还没有完成。

或者,您可以使用 CTRL-R 和一些其他命令来搜索您的历史记录,这会更有用。它特别有用,因为它会搜索匹配的潜台词。