J'ai vraiment du mal à comprendre callCC. J'ai la puissance de Continuations et j'ai utilisé le concept dans certains de mes projets pour créer des concepts sympas. Mais je n'ai jamais eu besoin d'utiliser quelque chose avec de plus grandes capacités quecont :: ((a->r)->r)-> Cont r a
.
Après l'avoir utilisé, il est très logique pourquoi ils appellent la Cont Monad la mère de toutes les monades, ENCORE, je ne sais pas quand devrais-je utiliser callCC
, et c'est exactement ma question.
haskell
functional-programming
monads
Alejandro Navas
la source
la source
Cont
? Lorsque vous dites que vous n'avez pas eu besoin d'utiliser quelque chose de plus puissant quecont
, cela signifie-t-il que vous n'avez pas utiliséreset
oushift
non?reset
oushift
. Je l'ai utilisé pour définir un langage intégré qui peut être suspendu jusqu'à ce qu'une action donnée soit résolue par un autre processus, puis il reprend avec la "continuation" donnée. Peut-être que je donne l'impression d'avoir beaucoup d'expérience avec Cont Monad, mais pas vraiment, je veux vraiment comprendre callCCRéponses:
callCC
vous donne une sémantique de "retour précoce", mais dans un contexte monadique.Supposons que vous vouliez
doOne
, et si cela revientTrue
, vous vous arrêtez immédiatement, sinon vous continuezdoTwo
etdoThree
:Vous voyez cette
if
branche là-bas? Une branche n'est pas si mal, pourrait être traitée, mais imaginez qu'il y a plusieurs points de ce genre où vous voulez juste renflouer? Cela devient très moche très rapidement.Avec
callCC
vous pouvez avoir un "retour anticipé": vous vous renflouez au point de branchement et n'avez pas à imbriquer le reste du calcul:Beaucoup plus agréable à lire!
Plus important encore, comme
ret
il ne s'agit pas d'une syntaxe spéciale (commereturn
dans les langages de type C), mais simplement d'une valeur comme les autres, vous pouvez également la transmettre à d'autres fonctions! Et ces fonctions peuvent alors effectuer ce qu'on appelle un "retour non local" - c'est-à-dire qu'elles peuvent "arrêter" ledoThings
calcul, même à partir de plusieurs appels imbriqués en profondeur. Par exemple, je pourrais factoriser la vérification dudoOne
résultat dans une fonction distinctecheckOne
comme celle-ci:la source
b
est fondamentalement juste un caractère générique afin que vous puissiez enchaîner plus de continuations dans callCC. Quoi qu'il en soit, une foisret
appliquée, la suite produite par l'appel cc "retournera" tout ce qui a été misret
. C'est assez compliqué, mais assez intelligent, mais extrêmement puissant, je ne vois pas beaucoup d'endroits où utiliser un tel pouvoir n'est pas comme tuer une mouche avec une bombe nucléaire