2016-06-19 3 views
2

Как работает управление историей в GHCI или других REPLs на основе Haskell? Поскольку Haskell - чистый язык, я предполагаю, что он реализован с использованием монады, возможно, state monad.Отслеживание истории в ghci

Просьба отметить, что я новичок в Haskell, поэтому, пожалуйста, предоставьте подробное объяснение, а не просто ссылку на источник.

+2

история GHCi не реализуется в Haskell вообще, это является частью третьей стороной библиотека под названием 'readline', которая написана на C. –

+1

Эта страница в Haskell Wiki [(link)] (https://wiki.haskell.org/Simple_StateT_use) содержит код для игры с угадыванием чисел, написанной с использованием трансформатора монада StateT. Если вы поймете, как работает этот код, я отвечу на ваш вопрос. Если вы не понимаете, как работает эта программа, я предлагаю вам ознакомиться с монадными и монадными трансформаторами. Вот некоторые переводы трансформаторов монады: [(link)] (https://en.wikibooks.org/wiki/Haskell/Monad_transformers) [(link)] (https://github.com/kqr/gists/blob/master /articles/gentle-introduction-monad-transformers.md) – ErikR

+0

Спасибо, не стесняйтесь отвечать, и я прочитаю его после прочтения ссылок на трансформаторы. – dimid

ответ

2

Это упрощенный пример того, как программа может сохранять историю команд, введенных пользователем. Это в основном имеет ту же структуру, что и угадывание игра чисел, поэтому, как только вы понимаете, что вы не должны иметь никаких проблем с пониманием этого:

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 [] 
+0

Большое спасибо, но у меня возникли проблемы с его сочетанием с моим кодом. Не могли бы вы взглянуть? http://stackoverflow.com/questions/37930204/combining-statet-with-inputt – dimid

Смежные вопросы