2010-04-04 17 views
12

Estoy leyendo el capítulo de Mónadas en Real World Haskell (capítulo 14). Una función es defined de la siguiente manera:¿El motivo de MonadState obtener y poner?

type RandomState a = State StdGen a 
getRandom :: Random a => RandomState a 
getRandom = 
    get >>= \gen -> 
    let (val, gen')= random gen in 
    put gen' >> 
    return val 

yo no entiendo muy bien el propósito de la funciones GET y PUT aquí. Reescribí la función como continuación de lo cual parece hacer lo mismo y es más concisa:

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s 

Así que mi pregunta es: ¿Cuál es el propósito de conseguir y poner en general?

+1

¿Solo en este caso, o el propósito de 'get' y' put' en general? Su uso se puede explicar más fácilmente en este último caso ... – kennytm

+0

En general; Voy a editar mi pregunta. – CiscoIPPhone

Respuesta

12

Es un poco de una coincidencia que random pasa a tener exactamente el patrón de la firma/el uso mismo tipo que la función interna de la State mónada (y de hecho en este caso podría ser aún más concisa, aunque tal vez más confuso, con getRandom2 = State random).

Sin embargo, más generalmente eso no se aplicará, y luego get y put son piezas de plomería convenientes cuyo significado es quizás más claro que escribir la función interna directamente. También ayudan a abstraer de la representación precisa utilizada por State - en realidad son miembros de clase de la clase más general MonadState, por lo que puede escribir más código polimórfico al usarlos.

+0

Tengo una pregunta más: ¿cómo el * put * mantiene el nuevo estado para la próxima llamada? La salida de * put * se ignora, no puedo resolverlo. Por favor, ayúdame. Gracias. –

+0

Eso es parte de la tubería interna de la mónada 'State'. La salida monádica de 'put' es de tipo'() 'para indicar que no es un valor útil. –

+0

Thx para la respuesta. Pero no entiendo completamente. ¿Significa que * put * tiene algún efecto secundario? ¿Puedes explicar cómo almacena el nuevo estado? Gracias. –

Cuestiones relacionadas