前言
我正试图围绕如何实际使用ContT
和callCC
寻找有用的东西。我在跟踪代码周围的信息和控制流时遇到了麻烦。(但是,这不是延续的意义吗?)
有很多不同的方法可以使用这个 monad 和一小部分不太直接的组合器来移动片段。我承认我仍然对我对 ContT 工作原理的理解感到不舒服,但我会指出我到目前为止所读到的内容:
- Haskell/继续传球风格
- Haskell Cont monad 如何以及为什么工作?
- 理解 Haskell callCC 例子
- Haskell 中的 Goto:谁能解释这种看似疯狂的 continuation monad 使用效果?
- 如何在 Haskell 中解释 callCC?
- Parsec 一般(让我开始走这条路的文章)
我想做的是发布一个伪代码示例,然后问一些关于它的问题。这代表了使用 ContT 的代码的典型外观
伪代码
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
问题
- 是什么决定了它的价值和类型
output
? b
的类型是什么意思k
?- 赋予的价值
k
去哪儿了? - 什么时候
inner_block
运行?它看到的是什么版本的状态? - 去哪里
rval
,它的类型是什么? k
和之间有什么关系rval
?- 当我申请
k
a) ininner_block
, b) inafter_callcc
, c) outside 时会发生block
什么? - 上述每个状态的版本是什么?
- 我需要做什么才能
k
摆脱block
? - 我可以放入
k
状态吗?
颜色编码,便于阅读