完全な関数型プログラミングをテーマとするすべての論文は、全体性を保証するために、ある種の静的型チェックを利用しています。これは、簡単にホイを検討することは、言語をチューリング完全にすることを意味します。問題は、全体の機能を保証する型付けされていない/動的に型付けされた形式はありますか?
編集する
言い換えれば、部分的な関数を構築することは不可能であり、合計関数のみを構築することを可能にする形式が存在するため、型チェッカーや終了解析のようなフィルタリングステージは必要ありません。
完全な関数型プログラミングをテーマとするすべての論文は、全体性を保証するために、ある種の静的型チェックを利用しています。これは、簡単にホイを検討することは、言語をチューリング完全にすることを意味します。問題は、全体の機能を保証する型付けされていない/動的に型付けされた形式はありますか?
編集する
言い換えれば、部分的な関数を構築することは不可能であり、合計関数のみを構築することを可能にする形式が存在するため、型チェッカーや終了解析のようなフィルタリングステージは必要ありません。
回答:
問題は、永久に実行される用語をどのように排除するかです。
特に、次のようなもの また、Yコンビネーターは、停止しない計算を構築するために使用できるため、使用言語に含まれていてはなりません。
システムFなどの静的型付けはこれらを排除します。それらは完全なラムダ計算から始まり、次に不適切な型の用語を除外します。
しかし、型なしの設定でこれを行うと、これらの用語を構成によって削除する必要があります。それらはあなたの言語では表現できません。
これを行うためのいくつかのばかげた方法を考えることができます。たとえば、関数を使用しない、またはリストをループするだけの命令型プログラムの言語などです。しかし、一般に、より高次の関数が得られるとすぐに、これらの問題のある構成要素は構成可能になります。だから不可能だとは言いませんが、意味のある方法で行うのはおそらく非常に難しいでしょう。
タイプシステムではないもの、終了チェッカーを使用してこれらのものを静的に除外することは可能ですが、これらは常に誤検知をスローし、静的なタイピングではありませんが、まだ静的フィルターです。あなたのプログラム。
「動的に型付けされる」と見なすものによっては、推論を使用して型を追跡し、実行時にエラーをスローするだけで、このようなプログラムを排除できることに注意してください。したがって、Yコンビネータのようなものは、まだすぐに拒否されます。これは動的に型付けされますが、おそらくあなたが探しているものではありません。
絶対に!既存の実装さえあります!私はこのloop.py
プログラムをpythonで書いた:
while True:
print "Hello world!"
print "20 GOTO 10"
そして、次のように実行しましたtimeout 10 python loop.py
。タダ!
要するに、「静的分析」とは何を考えていますか?forループのみを含むプログラミング言語は常に終了します。解析は「静的分析」ですか?Cプログラムをコンパイルして10秒間実行し、プログラムが終了した場合にのみコンパイルされたコードを返すコンパイラはどうでしょうか。
理論上のCSでは、何が起こるかを確認するために、「コンパイル時」にプログラムをいくつかのステップで実行するオプションが常にあります。実行時に、時間がかかりすぎる場合は、常にプログラムを早期に終了するオプションがあります。実際、これが「終了チェック」ではなく、プログラムの大部分が行うことです。ブラウザのJavaScriptスクリプト(または悪名高い「プログラムが応答しない」メッセージ)にも、このような機能があります。