【问题标题】:Keeping track of history in ghci在 ghci 中跟踪历史
【发布时间】:2016-10-20 21:27:50
【问题描述】:

历史管理如何在 GHCI 或其他基于 Haskell 的 REPL 中工作?由于 Haskell 是一种纯语言,我猜它是使用 monad 实现的,也许是 state monad

请注意我是 Haskell 的初学者,所以请提供详细的解释,而不仅仅是链接到源代码。

【问题讨论】:

  • GHCi 历史完全没有在 Haskell 中实现,它是一个名为 readline 的第三方库的一部分,它是用 C 编写的。
  • Haskell Wiki (link) 上的此页面包含使用 StateT monad 转换器编写的数字猜谜游戏的代码。如果您了解该代码的工作原理,我将为您的问题提供答案。如果您不了解该程序的工作原理,我建议您阅读 monad 和 monad 转换器。以下是一些 monad 转换器链接:(link)(link)
  • 谢谢,欢迎回答,看完变形金刚的链接我再看
  • 请注意,它确实可以根据State 的变体来实现(或更准确地说是StateT History IO,其中History = [String] 或其他东西)。它甚至可以单独在IO 内部实现:基本上IO 可以让人们进行带有副作用和可变变量的命令式编程 (IORef History)。碰巧 GHCi 为此重用了一个 C 库,而不是重新发明轮子。

标签: haskell state ghc read-eval-print-loop ghci


【解决方案1】:

这是一个程序如何保存用户输入命令历史的简化示例。它与猜数字游戏的结构基本相同,所以一旦你明白了,你应该就可以理解这个了:

import Control.Monad.State
import Control.Monad

shell :: StateT [String] IO ()
shell = forever $ do
  lift $ putStr "$ "
  cmd <- lift getLine
  if cmd == "history"
    then do hist <- get
            lift $ forM_ hist $ putStrLn
    else modify (++ [cmd])

main = do putStrLn "Welcome to the history shell."
          putStrLn "Type 'history' to see your command history."
          execStateT shell []

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 2013-03-17
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多