2011-09-06 9 views
11

Existe-t-il un moyen de sortir des "choses" d'une monade?Comment extraire une valeur d'une monade à Haskell?

Je développe un jeu, et j'essaie maintenant de comprendre les bases de données. J'ai trouvé happstack vraiment gentil, mais je ne peux pas obtenir la chose.

Par exemple, j'ai cette fonction (espérons que vous connaissez avec happstack)

getAllThings :: MonadIO m => m [Thing] 
getAllThings = do 
      elems <- query GetThings 
      return elems 

Alors je me m [Things], mais je ne peux pas l'utiliser dans mon modèle! Par exemple

doSomeThingWithThings :: [Thing] -> Something 

Je l'ai googlé et je n'ai rien trouvé.

+2

Vous pouvez profiter de [mes commentaires au sujet de l'imaginaire 'magicMonadUnwrap'] (http://stackoverflow.com/questions/7154518/unwrapping-a-monad/7156230#7156230) (réponse à une question StackOverflow similaire) –

Répondre

16

Vous n'êtes pas censé quitter monade IO cette façon (sauf fonction unsafePerformIO), mais vous pouvez toujours utiliser votre fonction à l'intérieur:

process :: MonadIO m => m() 
process = do 
      elems <- getAllThings 
      let smth = doSomeThingWithThings elems 
      -- ... 
+4

Vous pouvez penser à ceci: votre programme entier est monad de l'IO , et votre modèle est un tas de fonctions pures qui sont exécutées à l'intérieur. – bravit

+0

Oui !! Après avoir réfléchi à ma question avec vos réponses, je comprends que ça doit être comme ça !, mon jeu est (comme tu l'as dit) des fonctions pures, mais l'interface utilisateur est le vrai monde moche, donc la partie persistance doit l'être aussi! – Illiax

2

Après elems <- query GetThings les elems est [Thing] donc <- faire à l'intérieur est à obtenir choses hors de monade (appelé opération de liaison). La dernière déclaration return mettre les choses à l'intérieur d'une monade. Donc, soit vous pouvez vous appeler d'autres fonctions après avoir elems et avant return ou si jamais vous appelez getAllThings vous pouvez utiliser extraire la valeur à l'aide <- de la monade et le transmettre à votre fonction

Questions connexes