Um zu verstehen, wie man Monad-Transformatoren verwendet, schrieb ich den folgenden Code ohne einen. Es liest die Standardeingabe Zeile für Zeile und zeigt jede Zeile umgekehrt an, bis eine leere Zeile gefunden wird. Es zählt auch die Zeilen mit State
und zeigt am Ende die Gesamtzahl an.Verwenden Sie zwei Monaden ohne Transformator
import Control.Monad.State
main = print =<< fmap (`evalState` 0) go where
go :: IO (State Int Int)
go = do
l <- getLine
if null l
then return get
else do
putStrLn (reverse l)
-- another possibility: fmap (modify (+1) >>) go
rest <- go
return $ do
modify (+1)
rest
Ich wollte die aktuelle Zeilennummer vor jeder Zeile hinzufügen. Ich war in der Lage, es zu tun mit StateT
:
import Control.Monad.State
main = print =<< evalStateT go 0 where
go :: StateT Int IO Int
go = do
l <- lift getLine
if null l
then get
else do
n <- get
lift (putStrLn (show n ++ ' ' : reverse l))
modify (+1)
go
Meine Frage ist: wie man das gleiche in der Version ohne Monade Transformatoren zu tun?
Ich weiß, dass. Ich suche aus Effizienzgründen nicht nach einer Version ohne Monade-Transformator, ich möchte nur sehen, wie es aussehen würde, und etwas lernen, indem ich die beiden vergleiche und hoffentlich ein besseres Verständnis für die Notwendigkeit von Monad-Transformatoren erlange. – ByteEater
Auch das Ausführen der akkumulierten Zustandsberechnung in jeder Zeile ist etwas, das ich aus genau diesem Grund in Betracht gezogen und abgelehnt habe: Es scheint nicht der richtige Weg zu sein, Monaden zu verwenden, ein einfaches "Int" wäre eine bessere Wahl. Mit der Inkrementierung macht es keinen Unterschied, aber es wäre konzeptionell falsch, da die 'State'-Berechnung durch Voranstellen von' modify (+1) '-Aktionen aufgebaut wird, so dass, wenn ich z. 'modify (+ length l)', das würde nicht so funktionieren, wie es sollte. – ByteEater
@ByteEater, ist die Art, es ohne einen Monade-Transformator zu tun, nur die 'Int' herumgeben von Hand (ärgerlich) oder verwenden Sie eine' IORef' (begrenzt auf 'IO'-ähnliche Dinge und möglicherweise ineffizient, aber in Ordnung, wenn die Box ist unvermeidlich oder Updates sind selten). Ich weiß nicht, was du sonst noch suchst. – dfeuer