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?
'Control.Monad.State' no exporta el constructor' State', utiliza 'state' (con minúsculas' s'). – Vitus
@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
@Vitus: eso es extraño, porque su código realmente compila y funciona bien en mi GHCI 6.12.3 en Windows. –