人们如何在Scala中使用更大规模的延续?
Scala标准库的任何部分都是用CPS编写的吗?
使用延续是否有任何重大的性能损失?
可以说延续是monad吗?它们是monad的子集还是仅仅是实现monad的一种方式?
编辑:或者也许我弄错了,monads是一个比延续更抽象的概念?(所以我真的把苹果与橘子比较)
是否可以序列化包含yield语句的方法(或包含此类方法的类),以便在对类进行重新水化时,保留生成的迭代器的内部状态?
假设我们有一个单子,通过定义return,(>>=)以及一套法律.有一种数据类型
newtype C m a = C { unC ? forall r. (a ? m r) ? m r }
Run Code Online (Sandbox Code Playgroud)
也称为密度.C m a ? m a鉴于这m是一个Monad,即我们可以编写两个函数to ? Monad m ? m a ? C m a和from ? Monad m ? C m a ? m a
to ? Monad m ? m a ? C m a
to t = C $ \f ? t …Run Code Online (Sandbox Code Playgroud) 在以函数式语言编写memoization和continuation传递样式(CPS)函数的示例时,我最终使用了Fibonacci示例.然而,Fibonacci并没有真正受益于CPS,因为循环仍然必须经常以指数方式运行,而memoization它的第一次只有O(n)而后一次只有O(1).
结合CPS和记忆化既有的斐波那契数略有好处,但有没有解决,其中CPS是防止你用尽堆栈的最佳方式的例子,并提高了性能并在记忆化是不是一个解决方案?
或者:是否有何时选择其中一个或两者的指南?
我最近一直在寻找延续,我对正确的术语感到困惑.Gabriel Gonzalez 在这里说:
Haskell延续具有以下类型:
Run Code Online (Sandbox Code Playgroud)newtype Cont r a = Cont { runCont :: (a -> r) -> r }
即整个(a -> r) -> r事情是延续(没有包装)
在维基百科的文章,似乎说支持这个想法
延续是计算机程序的控制状态的抽象表示.
但是,这里作者说
Continuations是表示"要执行的剩余计算"的函数.
但这只是(a->r)该Cont类型的一部分.这与Eugene Ching 在这里所说的一致:
计算(函数),需要一个连续函数才能完全评估.
我们将会看到很多这样的功能,因此,我们会给它一个更直观的名称.我们叫他们等待功能.
我已经看到了另一个教程(Brian Beckman和Erik Meijer),他们调用了整个事物(等待函数)observable以及它完成观察者所需的函数.
(a->r)->r东西或只是(a->r)东西(没有包装)?我们可以将continuation monad变换器定义为
data Cont r m a = Cont {run :: (a -> m r) -> m r}
Run Code Online (Sandbox Code Playgroud)
Cont r m如果m是Alternativevia 的成员,我们可以给出Alternative实例
empty = Cont $ \f -> empty
ca <|> cb = Cont $ \f -> run ca f <|> run cb f
Run Code Online (Sandbox Code Playgroud)
然后允许some并many采用他们的默认方法.我的问题是,我们可以定义some并many在以下方面m的some和many,而不是默认的定义是什么?显而易见的选择
some ca = Cont $ \f -> some $ run ca f
many ca = Cont …Run Code Online (Sandbox Code Playgroud) continuations haskell typeclass applicative continuation-passing
基本上我想转换这个:
def data(block: T => Unit)
Run Code Online (Sandbox Code Playgroud)
到Stream(dataToStream是执行此转换的假设函数):
val dataStream: Stream[T] = dataToStream(data)
Run Code Online (Sandbox Code Playgroud)
我想这个问题可以通过延续来解决:
// let's assume that we don't know how data is implemented
// we just know that it generates integers
def data(block: Int => Unit) { for (i <- 0 to 10) block(i) }
// here we can print all data integers
data { i => println(i) }
// >> but what we really want is to convert data to the stream <<
// very dumb solution is …Run Code Online (Sandbox Code Playgroud) 有谁知道是否call/cc可以用lambdas和闭包实现?
它似乎会call/cc中断程序的流程(就像异常一样),但lambdas和闭包不能这样做.因此我认为call/cc无法通过lambdas和闭包实现.
还有什么想法吗?
continuations ×10
haskell ×3
scala ×3
yield ×2
.net ×1
applicative ×1
c# ×1
callback ×1
callcc ×1
f# ×1
generator ×1
lisp ×1
memoization ×1
monads ×1
ocaml ×1
scheme ×1
typeclass ×1
yield-return ×1