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

时间:2015-09-06 01:21:58

标签: haskell continuations callcc

序言

我正试图将实际使用ContTcallCC的方法用于实用。我无法跟踪代码周围的信息和控制流程。 (但是,这不是延续的意思吗?)

有很多不同的方法可以使用这个monad和少量非常直接的组合器来移动碎片。我会承认,我对ContT的工作原理仍然感到不安,但我会指出到目前为止我所读过的内容:

我想做的是发布一个psudo代码示例,然后询问一些有关它的问题。这代表使用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

问题

  1. 什么决定output的价值和类型?
  2. b类型中k的含义是什么?
  3. k的价值在哪里?
  4. inner_block何时开始?它看到的是什么版本的州?
  5. rval去哪里以及它的类型是什么?
  6. krval之间的关系是什么?
  7. 当我k中的inner_block,b)在after_callcc之外的block,c)中应用k时会发生什么?
  8. 以上各项中的州的版本是什么?
  9. 我需要做些什么才能从block中获取k
  10. 我可以将UPDATE newdb.yourtable newtable, olddb.yourtable oldtable SET newtable.somecolumn = oldtable.somecolumn WHERE newtable.id = oldtable.id 置于州吗?
  11. 颜色编码以便于阅读

    Color Coded example

1 个答案:

答案 0 :(得分:3)

  
      
  1. 什么决定output的价值和类型?
  2.   

它与rval的类型相同。除非inner_block使用k someValue来转义块的其余部分,否则该值也将相同。在这种情况下,output将为someValue

  
      
  1. b类型中k的含义是什么?
  2.   

粗略地说,b可以被理解为“任何东西”。也就是说,如果inner_block

...
v <- k someValue
use v

然后v :: b。但是,k someValue将永远不会运行块的其余部分,因为它将立即退出callCC。因此,v的任何具体值都不会被返回。由于此v可以有任何类型:use需要StringInt并不重要 - 它无论如何都没有被执行。

  
      
  1. k的价值在哪里?
  2.   

一旦内部块运行k someValuecallCCoutput作为inner_block返回值,并跳过块的其余部分。

  
      
  1. callCC何时开始?它看到的是什么版本的州?
  2.   

在调用rval时运行,并且看到与此时相同的状态。

  
      
  1. output去哪里以及它的类型是什么?
  2.   

进入k。相同的类型。

  
      
  1. rvalrval之间的关系是什么?
  2.   

kk的参数类型相同。

  
      
  1. 当我inner_block中的after_callcc,b)在block之外的k,c)中应用after_callcc时会发生什么?
  2.   

a)见上文。 b)k超出block范围。 c)也超出范围。

  
      
  1. 以上各项中的州的版本是什么?
  2.   

状态是“当前”状态。 (我不确定你到底要求的是什么)

  
      
  1. 我需要做些什么才能从import Control.Monad.Cont import Control.Monad.State import Control.Monad.Trans type SomeState = String type MyMonad r = ContT r (State SomeState) newtype K a b r = K ((K a b r, a) -> MyMonad r b) main = do print $ flip runState "init" $ runContT block return block :: MyMonad r Int block = do lift $ modify (++ ":start") (K myK, output) <- callCC $ \k -> do s <- lift $ get lift $ modify (++ ":inner(" ++ show (length s) ++")") return (K k, 10) lift $ modify (++ ":output=" ++ show output) s <- lift $ get when (length s <50) $ myK (K myK, output+1) return 5 中获取(5,"init:start:inner(10):output=10:output=11:output=12")
  2.   

我想这里需要一个递归类型。这是一次尝试:

k

打印

function copyTextFromCell(id1,id2){ 

    var cell1= document.getElementById(id1);
    var cell2= document.getElementById(id2);
    cell2.textContent = cell2.textContent+cell1.textContent;

}

copyTextFromCell("cell1","cell2");
  
      
  1. 我可以将{{1}}置于州吗?
  2.   

我相信你也需要一个递归类型。