2016-06-19 29 views
2

Wie funktioniert das Geschichtsmanagement in GHCI oder anderen Haskell-basierten REPLs? Da Haskell eine reine Sprache ist, denke ich, dass es mit einer Monade, vielleicht der state monad implementiert wird.Den Verlauf in ghci verfolgen

Bitte beachten Sie, ich bin ein Anfänger in Haskell, also bitte geben Sie eine detaillierte Erklärung, anstatt nur auf die Quelle zu verlinken.

+2

GHCi Geschichte nicht in Haskell implementiert ist, ist es ein Teil eines Drittanbieters ist Bibliothek namens 'readline', die in C geschrieben ist. –

+1

Diese Seite auf dem Haskell Wiki [(link)] (https://wiki.haskell.org/Simple_StateT_use) enthält Code für ein Zahlenratenspiel, das mit dem StateT Monad Transformer geschrieben wurde. Wenn Sie verstehen, wie dieser Code funktioniert, gebe ich eine Antwort auf Ihre Frage. Wenn Sie nicht verstehen, wie dieses Programm funktioniert, empfehle ich Ihnen, Monaden und Monadetransformatoren zu lesen. Hier sind einige Monad Transformer Links: [(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

Danke, fühlen Sie sich frei zu beantworten, und ich werde es lesen nach dem Lesen der Transformatoren Links – dimid

Antwort

2

Dies ist ein vereinfachtes Beispiel dafür, wie ein Programm einen Verlauf von Befehlen behält, die vom Benutzer eingegeben wurden. Es hat im Grunde die gleiche Struktur wie die Anzahl Ratespiel, so, wenn Sie verstehen, dass Sie keine Probleme haben, sollten verstehen dies:

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

Vielen Dank, aber ich habe Probleme, es mit meinem Code zu kombinieren. Könnten Sie einen Blick darauf werfen? http://stackoverflow.com/questions/37930204/combining-statet-with-inputt – dimid