Отслеживание истории в ghci
Как работает управление историей в GHCI или других основанных на Haskell REPL? Поскольку Haskell - чистый язык, я думаю, что он реализован с использованием монады, возможно, монады состояния.
Пожалуйста, обратите внимание, что я новичок в Haskell, поэтому, пожалуйста, предоставьте подробное объяснение, а не просто ссылку на источник.
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 []