- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法理解以前 question 的答案.我希望对以下内容的解释能够澄清事情。以下示例来自 fpcomplete
import Control.Monad.Trans.Class
import Control.Monad.Trans.Cont
main = flip runContT return $ do
lift $ putStrLn "alpha"
(k, num) <- callCC $ \k -> let f x = k (f, x)
in return (f, 0)
lift $ putStrLn "beta"
lift $ putStrLn "gamma"
if num < 5
then k (num + 1) >> return ()
else lift $ print num
alpha
beta
gamma
beta
gamma
beta
gamma
beta
gamma
beta
gamma
beta
gamma
5
let
callCC
中的表达式“返回”延续,以便以后可以使用。所以我尝试通过以下更简单的示例并对其进行修改来直接返回延续。
import Control.Monad.Trans.Class
import Control.Monad.Trans.Cont
main = flip runContT return $ do
lift $ putStrLn "alpha"
callCC $ \k -> do
k ()
lift $ putStrLn "uh oh..."
lift $ putStrLn "beta"
lift $ putStrLn "gamma"
alpha
beta
gamma
import Control.Monad.Trans.Class
import Control.Monad.Trans.Cont
main = flip runContT return $ do
lift $ putStrLn "alpha"
f <- callCC $ \k -> do
lift $ putStrLn "uh oh..."
return k
lift $ putStrLn "beta"
lift $ putStrLn "gamma"
f
并且在我希望打印的这个测试示例中未使用
uh oh...
beta
gamma
最佳答案
正如其他人所写的那样,最后一个示例由于无限类型而没有进行类型检查。
@augustss 提出了另一种解决此问题的方法:
You can also make a newtype to wrap the infinite (equi-)recursive type into a (iso-)recursive newtype. – augustss Dec 12 '13 at 12:50
import Control.Monad.Trans.Cont
import Control.Monad.Trans.Class
data Mu t = In { out :: t (Mu t) }
newtype C' b a = C' { unC' :: a -> b }
type C b = Mu (C' b)
unfold = unC' . out
fold = In . C'
setjmp = callCC $ (\c -> return $ fold c)
jump l = unfold l l
test :: ContT () IO ()
test = do
lift $ putStrLn "Start"
l <- setjmp
lift $ putStrLn "x"
jump l
main = runContT test return
关于haskell - 理解 Haskell callCC 例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20536700/
我开始接触 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
我是一名优秀的程序员,十分优秀!