Temat ogólny: Chociaż uważam, że pomysł układania monad razem jest bardzo interesujący, mam wiele problemów z wyobrażeniem sobie, w jaki sposób kod jest wykonywany, i jakie są odpowiednie rozkazy, aby uruchomić warstwy. Poniżej znajduje się jeden przykład stosu: Writer, State, State i Error, w określonej kolejności (lub jest tam?).Skąd bierze się kolejność wykonywania funkcji w monaderze?
-----------------------
-- Utility Functions --
-----------------------
type Memory = Map String Int
type Counter = Int
type Log = String
tick :: (MonadState Counter m) => m()
tick = modify (+1)
record :: (MonadWriter Log m) => Log -> m()
record msg = tell $ msg ++ "; "
------------------
-- MonadT Stack --
------------------
mStack :: (MonadTrans t, MonadState Memory m, MonadState Counter (t m), MonadError ErrMsg (t m), MonadWriter Log (t m)) => t m Int
mStack = do
tick
m <- lift get
let x = fromJust (M.lookup "x" m) in x
record "accessed memory"
case True of
True -> return 100
False -> throwError "false"
Uwaga w mStack
, czy zostanie zgłoszony błąd lub nie ma nic wspólnego z jakąkolwiek inną część funkcji.
Teraz idealnie chcę wyjście wyglądać następująco:
(Right 100, 1, "accessed memory", fromList [...])
lub ogólnie:
(output of errorT, output of stateT Counter, output of writerT, output of StateT Memory)
Ale nie mogę zmusić go do pracy. Konkretnie Próbowałem uruchomiony stos jakby Błąd znajduje się na najbardziej zewnętrznej warstwie:
mem1 = M.fromList [("x",10),("y",5)]
runIdentity $ runWriterT (runStateT (runStateT (runErrorT mStack) 0) mem1) ""
Ale otrzymuję komunikat o błędzie:
Couldn't match type `Int' with `Map [Char] Int'
Powyższy przykład na bok, w ogóle, kiedy apeluję:
runMonadT_1 (runMonadT_2 expr param2) param1
,
są funkcje związane z monadT_2
uruchom najpierw, a następnie to wyjście jest podłączone do funkcji związanych z monadT_1
? Innymi słowy, tak imperatywny jak kod wygląda w powyższej funkcji mStack
, kolejność wykonywania jest całkowicie zależna od kolejności, w jakiej monadT są uruchamiane (oprócz sztywności w strukturze wprowadzonej przez lift
)?