2009-08-20 58 views
13

我一直在阅读延续传球风格编程技术(C#3.0实现)。何时以及如何使用延续传球风格

为什么/何时使用这种技术会有用?

我该如何实现这个目标以获得那些真正的长链?这是否与咖喱相同(在谷歌中产生更好的搜索结果)?

由于

回答

12

在C#上下文CPS的excellent write-up通过韦斯代尔制成。我不认为我可能会添加任何有意义的东西。如果某些具体的事情不清楚,请继续询问。

+1

+1非常好的阅读:“大多数程序员都使用了回调函数,通常回调函数是在函数完成时调用的代码,在这种情况下,回调函数是明确传递的延续。 (来自文章) – 2011-03-19 19:08:37

+2

“继续是GOTO在功能和可检测性方面的功能对应物,它们可以表达任意的控制流程,如协程和异常,同时让一些最聪明的程序员感到困惑。” - 他们会变得疯狂。开始混合失败延续,成功延续等等,并且您可以在几十行难以理解但美丽的代码中进行疯狂的AI-esque操作。 – Eagle 2013-05-20 04:03:42

+0

@Eage:我拒绝接受这种否定判断。一个不只是比较延续到转到。这很牵强。 – 2015-09-01 03:02:51

5

要回答你的最后一个问题,延续传球的风格是不一样的咖喱。通过指定一个或多个参数来创建函数时,可以通过另一个函数创建一个函数,从而获得一个具有较少参数的函数。在某种程度上使用诸如F#和C#这样的函数式编程语言,可以将所有函数视为一个变量的函数。如果所述函数具有多于一个参数,则可以将其视为具有参数并用其余参数返回另一个函数。这是在C#讨好的例子:

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

凡功能咖喱总是返回2,当然有,这更有意义的用途。

关于延续传球风格,除了Wes Dyer博客链接,请查看F#异步工作流程,这是继续的实例或延续monad。您可以尝试使用术语continuation monad来查找一些其他文章。

相关问题