2011-09-06 12 views
11

C'è un modo per togliere "cose" da una monade?Come estrarre un valore da una monade in Haskell?

Sto sviluppando un gioco e ora sto cercando di capire i database. Ho trovato il happstack davvero bello, ma non riesco a ottenere la cosa.

Per esempio, io ho questa funzione (spero si ha familiarità con happstack)

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

così ottengo m [Things], ma non riesco a utilizzare questo nel mio modello! Per esempio

doSomeThingWithThings :: [Thing] -> Something 

Ho cercato su Google e non ho trovato nulla.

+2

Si può godere di [i miei commenti circa l'immaginario 'magicMonadUnwrap'] (http://stackoverflow.com/questions/7154518/unwrapping-a-monad/7156230#7156230) (rispondi ad una domanda StackOverflow simile) –

risposta

16

non si dovrebbe uscire IO Monade questo modo (tranne unsafePerformIO funzione), ma è comunque possibile utilizzare la funzione all'interno di esso:

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

Puoi pensare in questo modo: il tuo intero programma è IO monade e il tuo modello è un insieme di funzioni pure che vengono eseguite al suo interno. – bravit

+0

Sì !! dopo aver riflettuto sulla mia domanda con le tue risposte, capisco che deve essere così !, il mio gioco è (come hai detto) funzioni pure, ma l'interfaccia utente è il vero mondo brutto, quindi anche la parte di persistenza deve esserlo! – Illiax

2

Dopo elems <- query GetThings le elems è [Thing] così <- dentro fare è di ottenere cose da monade (chiamate operazione di bind). L'ultima affermazione return mette le cose dentro una monade. Quindi, o si può chiamare altre funzioni dopo avere ottenuto elems e prima return o dove mai si sta chiamando getAllThings è possibile utilizzare estrarre il valore utilizzando <- dalla monade e passarlo alla funzione

Problemi correlati