Estou realmente lutando para entender o callCC. Eu tenho o poder das continuações e tenho usado o conceito em alguns dos meus projetos para criar conceitos interessantes. Mas nunca precisei usar algo com mais recursos do que cont :: ((a->r)->r)-> Cont r a
.
Depois de usá-lo, faz muito sentido porque eles chamam a Cont Monad de mãe de todas as mônadas. AINDA, eu não entendo quando precisaria usá-la callCC
, e essa é exatamente a minha pergunta.
haskell
functional-programming
monads
Alejandro Navas
fonte
fonte
Cont
? Quando você diz que não precisou usar algo mais poderoso docont
que isso significa que você não usoureset
oushift
também?reset
oushift
. Usei-o para definir uma linguagem incorporada que pode ser suspensa até que uma determinada ação seja resolvida por outro processo e, em seguida, continue com a "continuação" especificada. Talvez eu dar a impressão de ter um monte de experiência com Cont Mônada, mas não muito realmente, eu realmente quero entender callCCRespostas:
callCC
fornece a semântica de "retorno antecipado", mas em um contexto monádico.Digamos que você queira
doOne
, e se isso retornarTrue
, você imediatamente para, caso contrário, prosseguedoTwo
edoThree
:Vê aquela
if
ramificação aí? Um ramo não é tão ruim assim, poderia ser tratado, mas imagine que há vários desses pontos em que você apenas quer fiança? Isso fica muito feio muito rapidamente.Com
callCC
você pode ter "retorno antecipado": você paga no ponto de ramificação e não precisa aninhar o restante do cálculo:Muito mais agradável de ler!
Mais importante, como
ret
aqui não há uma sintaxe especial (comoreturn
nas linguagens C), mas apenas um valor como qualquer outro, você também pode passá-lo para outras funções! E essas funções podem executar o que é chamado de "retorno não local" - ou seja, elas podem "parar" odoThings
cálculo, mesmo a partir de várias chamadas aninhadas em profundidade. Por exemplo, eu poderia fatorar a verificação dodoOne
resultado de uma função separadacheckOne
como esta:fonte
b
é basicamente apenas um curinga para que você possa encadear mais continuações no callCC. De qualquer forma, uma vezret
aplicada, a continuação produzida pela chamada cc "retornará" tudo o que foi inseridoret
. Isso é muito complicado, mas muito inteligente, mas extremamente poderoso eu não ver um monte de lugares onde o uso de tal poder não é como matar uma mosca com uma arma nuclear