Practico 6, ejercicio 8

Practico 6, ejercicio 8

de Santiago Martin Parodi Porro -
Número de respuestas: 3

Buenas noches, no logro resolver el ejercicio.
Veo que Cont es bastante similar a State. Hasta ahora tengo: 


data Cont a = Cont (Int -> (Int, a))

runCont :: Cont a -> a
runCont (Cont f) = snd $ f 0

instance Monad Cont where
  return a = Cont $ \c -> (c, a)

No me doy cuenta como implementar el resto de las cosas, ni si lo que tengo esta bien.

Gracias desde ya



En respuesta a Santiago Martin Parodi Porro

Re: Practico 6, ejercicio 8

de Marcos Viera - InCo -
Hola, como bien decís, es básicamente una mónada State donde el estado es un entero.
Lo que hiciste está bien, con el único detalle de que se acostumbra poner el valor de tipo a como primer componente del par.
Por lo que el tipo sería:
data Cont a = Cont (Int -> (a, Int))

La implementación de (>>=) es igual a la de la mónada estado.
Lo único que te quedaría por hacer es next, que debe construir un Cont cuya función toma un entero, y retorna el par con ese entero (como valor de retorno) y el entero incrementado en uno como nuevo estado. ¿Se entiende?
Cualquier cosa podés volver a preguntar.

saludos
En respuesta a Marcos Viera - InCo

Re: Practico 6, ejercicio 8

de Santiago Martin Parodi Porro -
Implemente esto:

data Cont a = Cont (Int -> (a, Int))

runCont :: Cont a -> a
runCont (Cont f) = fst $ f 0

next::Cont Int
next = Cont $ \c -> (c, c+1)

instance Monad Cont where
return a = Cont $ \c -> (a, c)

(Cont k) >>= f = Cont $ \c -> let (val, cnt) = k c
                                                     (Cont g) = f val
                                                      in g cnt

                                  
No compila ni siquiera, pero no me doy cuenta de como seria, algun pique?
Gracias!

En respuesta a Santiago Martin Parodi Porro

Re: Practico 6, ejercicio 8

de Marcos Viera - InCo -
No compila porque ahora para que algo sea instancia de Monad también tiene que ser instancia de Applicative (y Functor).
Solamente tenés que agregar estas líneas:

import Control.Monad

instance Functor Cont where
fmap = liftM

instance Applicative Cont where
pure = return
(<*>) = ap

saludos