静的型チェッカーなしの完全関数型プログラミング言語


7

完全な関数型プログラミングをテーマとするすべての論文は、全体性を保証するために、ある種の静的型チェックを利用しています。これは、簡単にホイを検討することは、言語をチューリング完全にすることを意味します。問題は、全体の機能を保証する型付けされていない/動的に型付けされた形式はありますか?

編集する

言い換えれば、部分的な関数を構築することは不可能であり、合計関数のみを構築することを可能にする形式が存在するため、型チェッカーや終了解析のようなフィルタリングステージは必要ありません。


3
投稿に「編集」マーカーを保持する必要はありません-変更履歴が利用できるので、編集はシームレスで、できれば既存の回答を無効にしないようにする必要があります。
Evil

2
ほとんどすべての言語が文字列の構文として定義されており、それはすでにフィルタリング段階です。
Gilles「SO-悪をやめる」

回答:


9

問題は、永久に実行される用語をどのように排除するかです。

特に、次のようなもの λバツバツ バツλバツバツ バツ また、Yコンビネーターは、停止しない計算を構築するために使用できるため、使用言語に含まれていてはなりません。

システムFなどの静的型付けはこれらを排除します。それらは完全なラムダ計算から始まり、次に不適切な型の用語を除外します。

しかし、型なしの設定でこれを行うと、これらの用語を構成によって削除する必要があります。それらはあなたの言語では表現できません。

これを行うためのいくつかのばかげた方法を考えることができます。たとえば、関数を使用しない、またはリストをループするだけの命令型プログラムの言語などです。しかし、一般に、より高次の関数が得られるとすぐに、これらの問題のある構成要素は構成可能になります。だから不可能だとは言いませんが、意味のある方法で行うのはおそらく非常に難しいでしょう。

タイプシステムではないもの、終了チェッカーを使用してこれらのものを静的に除外することは可能ですが、これらは常に誤検知をスローし、静的なタイピングではありませんが、まだ静的フィルターです。あなたのプログラム。

「動的に型付けされる」と見なすものによっては、推論を使用して型を追跡し、実行時にエラーをスローするだけで、このようなプログラムを排除できることに注意してください。したがって、Yコンビネータのようなものは、まだすぐに拒否されます。これは動的に型付けされますが、おそらくあなたが探しているものではありません。


これが私が「簡単にホイーを考えることはチューリング完全な言語にすること」と言った理由です...否定的ではありますが、これは非常に役立つ回答です。特にフィルター / 建設用語。これがまさに私が探している理由です。フィルターステージを必要とせずに、完全な関数を構築することのみを可能にする形式主義です。
user3368561 2016年

1
@ user3368561また、セマンティクスによってこれを強制できる方法がいくつかあります。たとえば、整数を修正します k、そしてそれ以上はしないでください k削減ステップ。しかし、終了は実際には、セマンティクスを変更したためであり、言語でそれを防止したわけではありません。
jmite

5

絶対に!既存の実装さえあります!私はこのloop.pyプログラムをpythonで書いた:

while True:
    print "Hello world!"
    print "20 GOTO 10"

そして、次のように実行しましたtimeout 10 python loop.py。タダ!

要するに、「静的分析」とは何を考えていますか?forループのみを含むプログラミング言語は常に終了します。解析は「静的分析」ですか?Cプログラムをコンパイルして10秒間実行し、プログラムが終了した場合にのみコンパイルされたコードを返すコンパイラはどうでしょうか。

理論上のCSでは、何が起こるかを確認するために、「コンパイル時」にプログラムをいくつかのステップで実行するオプションが常にあります。実行時に、時間がかかりすぎる場合は、常にプログラムを早期に終了するオプションがあります。実際、これが「終了チェック」ではなく、プログラムの大部分が行うことです。ブラウザのJavaScriptスクリプト(または悪名高い「プログラムが応答しない」メッセージ)にも、このような機能があります。

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