- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的很难理解 callCC。我得到了延续的力量,我一直在我的一些项目中使用这个概念来创造很酷的概念。但是我从来不需要使用比 cont :: ((a->r)->r)-> Cont r a
更强大的东西。 .
使用它之后,为什么他们称 Cont Monad 为所有 monads 之母是很有意义的,然而,我不知道什么时候需要使用 callCC
,这正是我的问题。
最佳答案
callCC
为您提供“提前返回”语义,但在单子(monad)上下文中。
说你想doOne
,如果返回 True
, 立即停止,否则继续 doTwo
和 doThree
:
doOne :: Cont r Bool
doTwo :: Cont r ()
doThree :: Cont r ()
doThings :: Cont r ()
doThings = do
one <- doOne
if one
then pure ()
else do
doTwo
doThree
if
在那里分支?一个分支还不错,可以处理,但想象一下有多个这样的点你只想保释?这很快就会变得非常难看。
callCC
您可以“提前返回”:您可以在分支点保释,而不必嵌套其余的计算:
doThings = callCC \ret -> do
one <- doOne
when one $ ret ()
doTwo
doThree
ret
这不是一个特殊的语法(如
return
在类 C 语言中),而只是一个与其他值一样的值,您也可以将其传递给其他函数!然后这些函数可以执行所谓的“非本地返回” - 即它们可以“停止”
doThings
计算,甚至来自多个嵌套调用。例如,我可以排除对
doOne
的检查。的结果到一个单独的函数
checkOne
像这样:
checkOne ret = do
one <- doOne
when one $ ret ()
doThings = callCC \ret -> do
checkOne ret
doTwo
doThree
关于haskell - 我可以用 callCC 做什么而不能用 cont 完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58733711/
我开始接触 Ruby 并遇到了一个以前从未见过的函数 -- callcc。 我已经了解了它的用途的一些一般概念,但是当我尝试编写一个示例时却得到了意想不到的结果。 require 'continuat
我认为 ContT 的正确类型应该是 newtype ContT m a = ContT {runContT :: forall r. (a -> m r) -> m r} 和其他控制运算符 shif
我试图弄清楚如何获得 R 的 callCC 函数,以便对函数进行短路评估,以便与 lapply 和 Reduce 等函数一起使用。 动机 这将使 Reduce 和 lapply 具有渐近效率 > O(
我无法理解以前 question 的答案.我希望对以下内容的解释能够澄清事情。以下示例来自 fpcomplete import Control.Monad.Trans.Class import Con
我的背景是 Javascript、Python 和一点 Haskell。我试图理解 callCC,有很多解释,但我找不到它们微不足道,我遇到了这个 https://www.cs.bham.ac.uk/
我正在尝试复习类幻灯片。该代码应该打印一次“早期工作”,然后打印两次“后期工作”(您可以设置后期工作的重复次数)。但是我想知道为什么这段代码不起作用,我该如何修改代码?从现在开始,代码将生成“稍后工作
我想学习一些关于 Continuation 的知识,使用 callcc 方法从一些文章中键入几个示例,但我遇到了错误: NoMethodError: undefined method `callcc'
继续寻求理解 ContT 和 friend 的意义。请考虑下面的( absurd 但说明性的)代码: v :: IO (Either String [String]) v = return $ Lef
我真的很难理解 callCC。我得到了延续的力量,我一直在我的一些项目中使用这个概念来创造很酷的概念。但是我从来不需要使用比 cont :: ((a->r)->r)-> Cont r a 更强大的东西
我正在尝试在工作中的 C++ 项目中使用协程。但是,由于 callcc() 的使用不明确,它不会编译。我已经尝试在协程构造函数中指定分配器,但这似乎没有什么不同。 在将代码剥离到最基本的部分后,我最终
让我们考虑突破一个非终止的折叠: (call/cc (lambda (folded) (stream-fold (lambda (acc v) (if ( foldl (\ac
我是一名优秀的程序员,十分优秀!