相关疑难解决方法(0)

Contt Monad:将各个部分放在一起

前言

我试图围绕如何实际使用ContTcallCC有用的东西.我无法跟踪代码周围的信息和控制流程.(但是,这不是延续的意义吗?)

有很多不同的方法可以用这个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)

问题

  1. 是什么决定了它的价值和类型output
  2. b这种类型的意思是k什么?
  3. 给予的价值在k哪里?
  4. 什么时候inner_block运行?它看到的是什么版本的州?
  5. 哪里rval去了,它的类型是什么?
  6. k和之间有什么关系rval? …

continuations haskell callcc

9
推荐指数
1
解决办法
445
查看次数

如何解释Haskell中的callCC?

在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)

scheme continuations haskell callcc

3
推荐指数
2
解决办法
568
查看次数

标签 统计

callcc ×2

continuations ×2

haskell ×2

scheme ×1