2011-09-06 11 views
11

¿Hay alguna forma de quitar "cosas" de una mónada?¿Cómo sacar un valor de una mónada en Haskell?

Estoy desarrollando un juego, y ahora estoy tratando de comprender las bases de datos. Encontré happstack realmente bueno, pero no puedo entenderlo.

Por ejemplo, tengo esta función (espero que esté familiarizado con happstack)

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

por lo que obtener m [Things], pero no puedo usar esto en mi modelo! Por ejemplo

doSomeThingWithThings :: [Thing] -> Something 

Busqué en Google esto y no encontré nada.

+2

Usted puede disfrutar de [mis comentarios acerca de lo imaginario 'magicMonadUnwrap'] (http://stackoverflow.com/questions/7154518/unwrapping-a-monad/7156230#7156230) (respuesta a una pregunta similar de StackOverflow) –

Respuesta

16

no se supone que para salir de la mónada IO esta manera (excepto unsafePerformIO función), pero todavía se puede utilizar su función dentro de él:

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

Puedes pensarlo así: todo tu programa es IO mónada , y su modelo es un montón de funciones puras que se ejecutan dentro de él. – bravit

+0

¡Sí! Después de volver a pensar mi pregunta con tus respuestas, entiendo que tiene que ser así, mi juego es (como dijiste) funciones puras, pero la interfaz de usuario es el mundo realmente feo, ¡así que la parte de persistencia tiene que ser también! – Illiax

2

Después de elems <- query GetThings los elems es [Thing] por lo <- el interior hacer es sobre conseguir cosas fuera de mónada (llamada operación de enlace). La última declaración return pone las cosas dentro de una mónada. Así que, o se puede llamar a otra función después de conseguir elems y antes return o donde quiera que está llamando getAllThings puede utilizar extraer el valor con <- de la mónada y pasarlo a su función

Cuestiones relacionadas