Отслеживание истории в 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 []
Другие вопросы по тегам