高階関数は、関数型プログラミングにより強力な機能を提供しますか?


13

cstheory.SEについても同様の質問をしました

Stackoverflowのこの回答によれば、非遅延純粋関数型プログラミング言語では複雑さを持つアルゴリズムがありますが、命令型プログラミングの同じアルゴリズムはです。FP言語に遅延を追加すると、アルゴリズムはます。ΩnログnΩnΩn

高階関数がある場合とない場合のFP言語を比較する同等の関係はありますか?まだチューリング完了ですか?もしそうなら、FPの高次の欠如は、言語の「強力」または効率を低下させますか?


どの FP言語ですか?
reinierpost

高階関数と遅延評価は同じではありません。あなたの質問はどれですか?
ラファエル

回答:


11

十分に強力な関数型プログラミング言語(クロージャーを実装するためのデータ型など)では、非機能化の変換により、高次のすべての使用を排除できます。この方法はこの種の言語をコンパイルするために使用されるため、これはパフォーマンスに影響を与えず、この設定ではより高い次数で言語の性能が低下することはないと想定できます。ただし、コードの記述方法には影響します。

しかし、言語が十分に強力でない場合、はい、高次は表現力を提供します。ラムダ計算を検討してください。高次関数がなければ、ほとんど何もできません。ほとんどの場合、最も基本的なデータ型(整数、ブール値)は関数を使用して実装されているためです。

結論として、それは本当に言語に依存します。


上記は私の答えです。以下に、命令型言語に関する通常の仮定についてのコメント。

非遅延関数型プログラミング言語では複雑さを持つアルゴリズムについてですが、命令型プログラミングの同じアルゴリズムはです。FP言語に遅延を追加すると、アルゴリズムはます。ΩnログnΩnΩn

このリファレンスをご覧ください。通常、RAMの長さ配列へのアクセスは時間あり、純粋なFPの同等の時間は時間であるという仮定です。それは完全に真実ではありません:RAM内のアクセス時間はである、メモリのサイズです。もちろん、です。実際には、配列の要素へのアクセスははるかに高速です。理由は、が制限されているが、が制限されているためです!nO1OログnOログmmmnmn

編集:リンクをありがとう(怠inessについての論文へのリンクは利用できません、ここに別のものがあります)。私の答えのコメントおよび上記に投稿されているように、RAMのモデルは、1つのアドレスのサイズが制限されていない場合でも時間のルックアップを提供するため、純粋なFPに少し不公平です。レイジートリックがどのように機能するかはまだ理解していませんが、これはこの特定の問題のためだけのものであることに注意することが重要だと思います。O1


4

それはあなたが表現力で何を意味するかにかかっています。

高階は何かを追加するという議論があります:一階言語では、プリミティブな再帰はアッカーマン関数を表現するのに十分ではありません。ただし、高階関数が存在する場合は、プリミティブな再帰で十分です。

アッカーマン 0=λバツバツ+1アッカーマン m+1=イター アッカーマン mイター f 0=f 1イター f n+1=f イター f n

これは、プリミティブな再帰のみを使用してアッカーマン関数を定義します。

イターイターNkNkイターNNNN

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.