有沒有不基於lisp、c++的例子,最好是python的,也有lamdba expression嘛。
回複內容:
CPS把函數調用完之後接下來要執行的代碼通過閉包包裹並作為函數參數調用要執行的函數。
Continuation Passing Style Revisited Part Five: CPS and AsynchronyCPS變換本質上就是調用一個函數的時候,給它傳入另一個函數(所以,語言必須得支援高階函數和閉包才行),被調函數不把結果返回調用者,而是將結果返回給通過參數傳進來的那個函數。
我不清楚這個概念在別的語言裡有沒有實現,或者叫不同的名字。
這裡有個 scheme 的例子:call/cc 探秘從另一個角度回答下吧。
帶 callcc 的 Lambda 演算(叫演算)可以經 Curry-Howard 同構到經典邏輯,而普通的演算只能同構到直覺邏輯。但是形式邏輯中有一個 Gilvenko 定理,它聲稱:
對任何命題和前提,在經典邏輯中 若且唯若在直覺邏輯中
在證明這個定理之後哥德爾(對,就是證明存在不確定命題的那個)和根岑(自然演繹和相繼式演算的發明人)發明了雙否定變換,也叫哥德爾-根岑變換,其規則是:
注意到哥德爾-根岑變換任意命題都和原命題經典等價,但並非直覺等價(直覺邏輯本身否認),但是按照 Gilvenko 定理,雙否定命題若在直覺邏輯體系中可證明為真,則在經典邏輯體系裡必為真,反之亦然。
那麼按照 Curry-Howard 同構,演算下的類型指派可以經過哥德爾-根岑變換得到一個演算類型指派:,將運算式(同構於證明過程)變為的過程就是 CPS 變換。直接照搬哥德爾-根岑變換裡的類型的話,我們有如下結果:
原子
調用
抽象
call/cc 運算元
可以證明,,即:CPS 變換不改變語義。
當然這個版本的 CPS 是非常冗長的,市面上見到的那些都是在變換是之後直接做了規約,刪掉大堆 Redex 的。
上面這些再一次說明了,邏輯學和編程有多麼緊密的聯絡。來個簡明補充。
這是個簡單Function Compute輸出:
static int Times3(int x) { return x * 3; } Console.WriteLine(Times3(5));
(答案抄襲自http://www.cs.indiana.edu/cgi-pub/lkuper/c311/_media/cps-notes.scm)
定義下面四個函數(為了保持和原答案一致,其實兩個就夠了)
def f(var0): passdef g(var0, var1): return passdef h(var0): return passdef j(var0): return pass
其實就是把
Fuckee FindFuckee(){return kula;}void Fuck(Fuckee fuckee, int count){for(int i=0;i<count;i++)fuckee.Fuck();}void Main(){Fuck(FindFuckee(), 100);}
可以補一補邏輯學....@Belleve的回答太抽象了,沒邏輯背景的人看不懂,
我在Quora上看到一個回答寫得挺好的,裡面從邏輯學的角度解釋的一節或許可以作為 @Belleve答案的補充:
What is continuation-passing style in functional programming?
以上就是函數式編程中cps(continuation-passing style )是什麼意思?的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!