序言
我正试图将实际使用ContT
和callCC
的方法用于实用。我无法跟踪代码周围的信息和控制流程。 (但是,这不是延续的意思吗?)
有很多不同的方法可以使用这个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
问题
output
的价值和类型?b
类型中k
的含义是什么?k
的价值在哪里?inner_block
何时开始?它看到的是什么版本的州?rval
去哪里以及它的类型是什么?k
和rval
之间的关系是什么?k
中的inner_block
,b)在after_callcc
之外的block
,c)中应用k
时会发生什么?block
中获取k
?UPDATE newdb.yourtable newtable, olddb.yourtable oldtable
SET newtable.somecolumn = oldtable.somecolumn
WHERE newtable.id = oldtable.id
置于州吗?颜色编码以便于阅读
答案 0 :(得分:3)
- 什么决定
醇>output
的价值和类型?
它与rval
的类型相同。除非inner_block
使用k someValue
来转义块的其余部分,否则该值也将相同。在这种情况下,output
将为someValue
。
- 醇>
b
类型中k
的含义是什么?
粗略地说,b
可以被理解为“任何东西”。也就是说,如果inner_block
是
...
v <- k someValue
use v
然后v :: b
。但是,k someValue
将永远不会运行块的其余部分,因为它将立即退出callCC
。因此,v
的任何具体值都不会被返回。由于此v
可以有任何类型:use
需要String
或Int
并不重要 - 它无论如何都没有被执行。
- 醇>
k
的价值在哪里?
一旦内部块运行k someValue
,callCC
将output
作为inner_block
返回值,并跳过块的其余部分。
- 醇>
callCC
何时开始?它看到的是什么版本的州?
在调用rval
时运行,并且看到与此时相同的状态。
- 醇>
output
去哪里以及它的类型是什么?
进入k
。相同的类型。
- 醇>
rval
和rval
之间的关系是什么?
k
与k
的参数类型相同。
- 当我
醇>inner_block
中的after_callcc
,b)在block
之外的k
,c)中应用after_callcc
时会发生什么?
a)见上文。
b)k
超出block
范围。
c)也超出范围。
- 以上各项中的州的版本是什么?
醇>
状态是“当前”状态。 (我不确定你到底要求的是什么)
- 我需要做些什么才能从
醇>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")
?
我想这里需要一个递归类型。这是一次尝试:
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}}置于州吗?
醇>
我相信你也需要一个递归类型。