Estoy realmente luchando por entender callCC. Obtengo el poder de las Continuaciones y he estado usando el concepto en algunos de mis proyectos para crear conceptos geniales. Pero nunca he necesitado usar algo con mayores capacidades que cont :: ((a->r)->r)-> Cont r a
.
Después de usarlo, tiene mucho sentido por qué llaman a Cont Monad la madre de todas las mónadas, PERO, no entiendo cuándo necesitaría usar callCC
, y esa es exactamente mi pregunta.
haskell
functional-programming
monads
Alejandro Navas
fuente
fuente
Cont
? Cuando dices que no has necesitado usar algo más poderoso quecont
eso, ¿eso significa que no has usadoreset
oshift
tampoco?reset
oshift
. Lo he usado para definir un lenguaje eembedded que se puede suspender hasta que una acción determinada se resuelva mediante otro proceso, y luego se reanuda con la "continuación" dada. Tal vez doy la impresión de tener mucha experiencia con Cont Monad, pero no tanto, solo quiero entender callCCRespuestas:
callCC
le ofrece una semántica de "retorno temprano", pero en un contexto monádico.Digamos que quería hacerlo
doOne
, y si eso regresaTrue
, se detiene inmediatamente, de lo contrario continúadoTwo
ydoThree
:¿Ves esa
if
ramificación allí? Una rama no es tan mala, podría tratarse, pero ¿imagina que hay múltiples puntos en los que solo desea rescatar? Esto se pone muy feo muy rápido.Con
callCC
usted puede tener un "retorno temprano": puede pagar bajo fianza en el punto de ramificación y no tiene que anidar el resto del cálculo:Mucho más agradable de leer!
Más importante aún, dado que
ret
aquí no hay una sintaxis especial (comoreturn
en los lenguajes tipo C), sino solo un valor como cualquier otro, ¡también puede pasarla a otras funciones! Y esas funciones pueden realizar lo que se llama "retorno no local", es decir, pueden "detener" eldoThings
cálculo, incluso desde múltiples llamadas anidadas profundas. Por ejemplo, podría factorizar la comprobación deldoOne
resultado en una función separadacheckOne
como esta:fuente
b
es básicamente solo un comodín para que pueda encadenar más continuaciones dentro de callCC. De todos modos, una vez queret
se aplica, la continuación producida por la llamada cc "devolverá" lo que se haya introducidoret
. Eso es bastante complicado, pero bastante inteligente, pero extremadamente poderoso. No veo muchos lugares donde usar ese poder no sea como matar una mosca con una bomba nuclear