在 ghci 中跟踪历史记录
Keeping track of history in ghci
历史管理在 GHCI 或其他基于 Haskell 的 REPL 中是如何工作的?由于 Haskell 是一种纯语言,我猜它是使用 monad 实现的,也许是 state monad.
请注意,我是 Haskell 的初学者,所以请提供详细的解释,而不仅仅是链接到源。
这是一个简化的示例,说明程序如何保存用户输入的命令的历史记录。基本上和猜数字游戏的结构是一样的,所以一旦你明白了你应该不难理解这个:
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 []
历史管理在 GHCI 或其他基于 Haskell 的 REPL 中是如何工作的?由于 Haskell 是一种纯语言,我猜它是使用 monad 实现的,也许是 state monad.
请注意,我是 Haskell 的初学者,所以请提供详细的解释,而不仅仅是链接到源。
这是一个简化的示例,说明程序如何保存用户输入的命令的历史记录。基本上和猜数字游戏的结构是一样的,所以一旦你明白了你应该不难理解这个:
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 []