目次
回复内容:
ホームページ バックエンド開発 Python チュートリアル 函数式编程中cps(continuation-passing style )是什么意思?

函数式编程中cps(continuation-passing style )是什么意思?

Mar 30, 2017 pm 03:23 PM

有没有不基于lisp、c++的例子,最好是python的,也有lamdba expression嘛。

回复内容:

CPS把函数调用完之后接下来要执行的代码通过闭包包裹并作为函数参数调用要执行的函数。

Continuation Passing Style Revisited Part Five: CPS and AsynchronyCPS变换本质上就是调用一个函数的时候,给它传入另一个函数(所以,语言必须得支持高阶函数和闭包才行),被调函数不把结果返回调用者,而是将结果返回给通过参数传进来的那个函数。

我不清楚这个概念在别的语言里有没有实现,或者叫不同的名字。

这里有个 scheme 的例子:call/cc 探秘从另一个角度回答下吧。
带 callcc 的 Lambda 演算(叫\lambda\mu演算)可以经 Curry-Howard 同构到经典逻辑,而普通的\lambda演算只能同构到直觉逻辑。但是形式逻辑中有一个 Gilvenko 定理,它声称:

对任何命题p和前提\Gamma,在经典逻辑中 \Gamma\vdash p若且唯若在直觉逻辑中\Gamma\vdash\neg\neg p

在证明这个定理之后哥德尔(对,就是证明存在不确定命题的那个)和根岑(自然演绎和相继式演算的发明人)发明了双否定变换,也叫哥德尔-根岑变换,其规则是:
\alpha^{*}=(\alpha\rightarrow\bot)\rightarrow\bot
(\alpha\rightarrow\beta)^*=\alpha^* \rightarrow \beta^*
注意到哥德尔-根岑变换任意命题都和原命题经典等价,但并非直觉等价(直觉逻辑本身否认\neg\neg\alpha\rightarrow\alpha),但是按照 Gilvenko 定理,双否定命题\alpha^*若在直觉逻辑体系中可证明为真,则在经典逻辑体系里\alpha必为真,反之亦然。
那么按照 Curry-Howard 同构,\lambda\mu演算下的类型指派\Gamma\vdash e:\alpha可以经过哥德尔-根岑变换得到一个\lambda演算类型指派:\Gamma^*\vdash e^*:\alpha^*,将表达式(同构于证明过程)e变为e^*的过程就是 CPS 变换。直接照搬哥德尔-根岑变换里的类型的话,我们有如下结果:

  1. 原子 a^*=\lambda\kappa.\kappa a

  2. 调用 (EF)^*=\lambda\kappa.E^*(\lambda E'.F^* (\lambda F'.(E'F')\kappa))

  3. 抽象 (\lambda x.E)^*=\lambda\kappa.\kappa(\lambda x.\lambda k. (e^*)k)

  4. call/cc 算子\mathrm{call/cc}=\lambda\kappa.\kappa(\lambda f.\lambda k.f k k)

可以证明,E^*(\lambda x.x) =_\beta E,即:CPS 变换不改变语义。
当然这个版本的 CPS 是非常冗长的,市面上见到的那些都是在变换是之后直接做了\beta规约,删掉大堆 Redex 的。

上面这些再一次说明了,逻辑学和编程有多么紧密的联系。 来个简明补充。

这是个简单函数计算输出:

  static int Times3(int x)
    {
        return x * 3;
    }
   Console.WriteLine(Times3(5));
ログイン後にコピー

(答案抄袭自cs.indiana.edu/cgi-pub/
定义下面四个函数(为了保持和原答案一致,其实两个就够了)

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 )是什么意思?的内容,更多相关内容请关注PHP中文网(www.php.cn)!

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go 言語で関数型プログラミングとラムダ式をマスターする Go 言語で関数型プログラミングとラムダ式をマスターする Nov 30, 2023 am 10:46 AM

現代のプログラミングの世界では、関数型プログラミング (略して FP) が徐々に人気のあるプログラミング パラダイムになってきています。それは、プログラムを構築するための基本的な構成要素として関数を使用することを強調し、計算プロセスを関数間の継続的な転送と変換と見なします。近年、Go 言語 (Golang とも呼ばれます) は、そのシンプルさ、効率性、同時実行の安全性などの特性により、さまざまな分野で徐々に広く使用されています。 Go 言語自体は純粋な関数型プログラミング言語ではありませんが、十分な機能を提供します。

C++ の関数型プログラミング手法 C++ の関数型プログラミング手法 Aug 22, 2023 am 10:36 AM

C++言語には優れたプログラミング手法が数多くありますが、その中でも関数型プログラミングは非常に実用的な技術です。関数型プログラミングは関数の再利用性と柔軟性を重視しており、これによりコードがより明確になり保守しやすくなります。この記事では、C++ の関数型プログラミング手法を紹介します。 1. 関数オブジェクト 関数オブジェクトは、関数とみなすことができる呼び出し可能なオブジェクトです。 C++ の関数オブジェクトは、クラス オブジェクトまたは関数ポインターにすることができます。関数オブジェクトは STL アルゴリズムで使用でき、他の関数のパラメーターとしても使用できます。ここでは簡単な

関数プログラミングに C++ ラムダ式を使用する利点は何ですか? 関数プログラミングに C++ ラムダ式を使用する利点は何ですか? Apr 17, 2024 am 10:18 AM

C++ ラムダ式は、関数型プログラミングに次のような利点をもたらします。 シンプルさ: 匿名インライン関数により、コードの可読性が向上します。コードの再利用: コードの再利用を容易にするために、ラムダ式を渡したり保存したりできます。カプセル化: 別の関数を作成せずにコードの一部をカプセル化する方法を提供します。実際のケース: リスト内の奇数をフィルタリングします。リスト内の要素の合計を計算します。ラムダ式は、関数型プログラミングの簡素化、再利用性、カプセル化を実現します。

遅延評価を使用して Golang 関数型プログラムを最適化するにはどうすればよいですか? 遅延評価を使用して Golang 関数型プログラムを最適化するにはどうすればよいですか? Apr 16, 2024 am 09:33 AM

Go では、遅延データ構造を使用して遅延評価を実装できます。実際の値をカプセル化し、必要な場合にのみ評価するラッパー型を作成します。関数型プログラムでのフィボナッチ数列の計算を最適化し、実際に必要になるまで中間値の計算を延期します。これにより、不要なオーバーヘッドが排除され、関数型プログラムのパフォーマンスが向上します。

Python ラムダ式: 省略、簡潔、強力 Python ラムダ式: 省略、簡潔、強力 Feb 19, 2024 pm 08:10 PM

pythonLambda 式は、簡潔で読みやすく、使いやすいコードを作成するための強力で柔軟なツールです。これらは、他の関数に引数として渡したり、変数に保存したりできる匿名関数をすばやく作成するのに最適です。 Lambda 式の基本構文は次のとおりです。 lambdaarguments:expression たとえば、次の Lambda 式は 2 つの数値を加算します: lambdax,y:x+y この Lambda 式は、次のように引数として別の関数に渡すことができます。 defsum( x ,y):returnx+yresult=sum(lambdax,y:x+y,1,2) この例では

Golang 関数型プログラミングのよくある間違いと落とし穴 Golang 関数型プログラミングのよくある間違いと落とし穴 Apr 30, 2024 pm 12:36 PM

Go で関数型プログラミングを使用する場合に注意すべき 5 つの一般的な間違いと落とし穴があります。 参照を誤って変更することを避け、新しく作成された変数が返されるようにしてください。同時実行の問題を解決するには、同期メカニズムを使用するか、外部の可変状態のキャプチャを避けます。コードの可読性と保守性を向上させるために、部分的な機能化は控えめに使用してください。アプリケーションの堅牢性を確保するために、常に関数内のエラーを処理してください。パフォーマンスへの影響を考慮し、インライン関数、フラット化されたデータ構造、操作のバッチ処理を使用してコードを最適化します。

Python ラムダ式: 匿名関数の威力を明らかにする Python ラムダ式: 匿名関数の威力を明らかにする Feb 24, 2024 am 09:01 AM

Python のラムダ式は、匿名関数の別の構文形式です。これは、プログラム内のどこにでも定義できる小さな匿名関数です。ラムダ式はパラメータ リストと式で構成されます。式には有効な Python 式を使用できます。ラムダ式の構文は次のとおりです: lambdaargument_list:expression. たとえば、次のラムダ式は 2 つの数値の合計を返します: lambdax,y:x+y. このラムダ式は、マップなどの他の関数に渡すことができます。 () 関数:数値=[ 1,2,3,4,5]結果=マップ(ラムダ

C++ での関数型プログラミングに関するよくある質問 面接での質問 C++ での関数型プログラミングに関するよくある質問 面接での質問 Aug 22, 2023 pm 05:28 PM

コンピューター分野で C++ が広く応用され、プログラミング パラダイムが継続的に探求されていることから、関数型プログラミングも大きな関心事となっています。 C++ では、関数型プログラミングには多くの特別な概念と構文があるため、面接では関連する質問が含まれることがよくあります。この記事では、C++ の関数型プログラミングに関するよくある面接の質問を要約し、回答します。 1. 関数型プログラミングの長所と短所 面接官は、関数型プログラミングの長所と短所についての理解を尋ねる場合があります。関数型プログラミングには次の利点があります。 可読性が高い。関数型プログラミングは関数の出力のみに焦点を当てます。

See all articles