何时以及如何使用延续传递方式

Gur*_*epS 14 c#

我一直在阅读有关继续传递样式编程技术(C#3.0实现)的内容.

为何/何时使用此技术会有用?

如何实现这一点以获得那些真正的长链?这与currying相同(这会在google中产生更好的搜索结果)吗?

谢谢

Pav*_*aev 13

一个优秀的写了关于CPS在C#中的上下文是由韦斯·戴尔制造.我认为我不可能添加任何有意义的东西.如果某些具体事情不明确,请继续询问.

  • "继续是GOTO功能和不可思议性的功能对应物.它们可以像协同程序和异常一样表达任意控制流,同时令一些最聪明的程序员感到困惑." - 他们会变得疯狂 开始混合失败延续,成功延续等等,你可以用几十行难以理解但很漂亮的代码进行疯狂的AI-esque操作. (3认同)

eul*_*rfx 5

要回答你的最后一个问题,继续传递风格是不一样的.当你从另一个函数创建一个函数时,你可以通过指定一个或多个参数来进行curry,从而获得一个参数更少的函数.在函数式编程语言(如F#和C#)中进行一定程度的使用,可以将所有函数视为一个变量的函数.如果所述函数具有多个参数,则可以将其视为具有on参数并返回具有其余参数的另一函数.这是c#中currying的一个例子:

public static class FuncExtensions
{
        public static Func<A, Func<R>> Curry<A, R>(this Func<A, R> f)
        {
            return a => () => f(a);
        }
}

Func<int, int> f = x => x + 1;

Func<int> curried = f.Curry()(1);
Run Code Online (Sandbox Code Playgroud)

咖喱功能将永远返回2.当然,这有更多的启发性用途.

关于延续传递样式,除了链接到Wes Dyer博客之外,还要查看F#异步工作流,它们是continuation的实例,或者是continuation monad.您可以尝试使用术语continuation monad来查找其他一些文章.