前言
我试图围绕如何实际使用ContT和callCC有用的东西.我无法跟踪代码周围的信息和控制流程.(但是,这不是延续的意义吗?)
有很多不同的方法可以用这个monad和少量非常直接的组合器来移动碎片.我将承认我对ContT的工作方式的理解仍感到不安,但我会指出我到目前为止所阅读的内容:
我想做的是发布一个psudo-code示例,然后询问一些有关它的问题.这代表使用ContT的典型代码外观
Psudo码
type MyMonad r = ContT r (State SomeState)
main = do
runState s_init $ runContT block print
block :: MyMonad r a0
block = do
before_callcc
output <- callCC $ \k -> do
rval <- inner_block
return rval
after_callcc
Run Code Online (Sandbox Code Playgroud)
问题
output?b这种类型的意思是k什么?k哪里?inner_block运行?它看到的是什么版本的州?rval去了,它的类型是什么?k和之间有什么关系rval? …在Scheme中执行从call/cc有效跳转到初始调用/ cc 获得的延续并恢复保存的调用堆栈.
我刚刚开始学习Haskell,我正在试图弄清楚如何理解callCC.这是试图callCC理解Scheme的理解call/cc.执行callCC是
callCC f = cont $ \h -> runCont (f (\a -> cont $ \_ -> h a)) h
Run Code Online (Sandbox Code Playgroud)
据我所知,没有提到有关保存或恢复调用堆栈的内容.callCCHaskell的解释是如何熟悉Scheme的call/cc.
编辑:也许如果有人可以将以下内容翻译成Haskell,这将有助于我理解.
(define (f return)
(return 2)
3)
(display (f (lambda (x) x))) ; displays 3
(display (call-with-current-continuation f)) ; displays 2
Run Code Online (Sandbox Code Playgroud)