2009-08-20 18 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來查找一些其他文章。

相關問題