2012-03-14 17 views
12

Estaba leyendo Learn You a Haskell's guide on the state monad, pero tuve problemas para entenderlo ya que el ejemplo de la pila no pudo compilarse. En la guía, se utiliza el siguiente fragmento de código:La mónada del estado y learnyouahaskell.com

import Control.Monad.State 

type Stack = [Int] 

pop :: State Stack Int 
pop = State $ \(x:xs) -> (x,xs) 

push :: Int -> State Stack() 
push a = State $ \xs -> ((),a:xs) 

Si bien entiendo lo que tiene que hacer, no se compilará. No tengo ni idea de porqué. El mensaje de error es:

Stack.hs:6:7: Not in scope: data constructor `State' 

Stack.hs:9:10: Not in scope: data constructor `State' 

Esto no tiene sentido para mí, ya que "Estado" es, que yo sepa, de hecho, un constructor de datos, definida como

newtype State s a = State { runState :: s -> (a,s) } 

Es la guía "equivocado" , y si es así, ¿cómo lo arreglo?

+5

'Control.Monad.State' no exporta el constructor' State', utiliza 'state' (con minúsculas' s'). – Vitus

+0

@Vitus Bueno, no sabía [esa función] (http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/Control-Monad-Trans-State-Lazy.html#v : estado) fue exportado. Creo que deberías escribirlo como una respuesta en lugar de un comentario. – danr

+0

@Vitus: eso es extraño, porque su código realmente compila y funciona bien en mi GHCI 6.12.3 en Windows. –

Respuesta

18

Como mencioné en los comentarios, deberías usar state en lugar de State.


El problema es que State no es de tipo de datos independiente (o más bien newtype), pero es el StateT transformador aplicado a Identity mónada. En realidad, es definido como

type State s = StateT s Indentity 

y porque es sólo sinónimo type, no puede tener State constructor. Es por eso que Control.Monad.State usa state.

+0

Compila ahora :) ¡Genial, gracias! – Undreren

+0

Esto ya no funciona. ¿Alguien sabe de la sintaxis correcta? –

Cuestiones relacionadas