web-dev-qa-db-ja.com

Scalaの型システムはチューリング完全です。証明?例?利点?

Scalaの型システムはチューリング完全であるという主張があります。私の質問は次のとおりです。

  1. これに対する正式な証明はありますか?

  2. Scala型システムでは、単純な計算はどのようになりますか?

  3. これはScala-言語に何らかの利点がありますか?これにより、チューリング完全型システムのない言語と比較して、Scalaが何らかの形でより「強力」になりますか?

これは一般的に言語と型システムに当てはまると思います。

55
Adrian

チューリング完全であることが知られているSKIコンビネータ微積分のタイプレベルの実装に関するブログ投稿がどこかにあります。

チューリング完全型システムには、基本的にチューリング完全言語と同じ利点と欠点があります。何でもできますが、証明できることはほとんどありません。特に、最終的に何かをすることを証明することはできません。

タイプレベルの計算の一例は、Scala 2.8の新しいタイプ保存コレクショントランスフォーマーです。Scala 2.8、mapfilterなどは、呼び出されたのと同じタイプのコレクションを返すことが保証されています。したがって、filter a Set[Int]の場合、Set[Int]が返され、mapList[String]List[Whatever the return type of the anonymous function is]が返されます。

ご覧のとおり、mapは実際に要素タイプを変換できます。では、新しい要素タイプを元のコレクションタイプで表すことができない場合はどうなりますか?例:BitSetには、固定幅の整数のみを含めることができます。では、BitSet[Short]があり、各数値をその文字列表現にマップするとどうなりますか?

someBitSet map { _.toString() }

結果wouldBitSet[String]になりますが、それは不可能です。したがって、Scalaは、BitSetの最も派生したスーパータイプを選択します。これは、String(この場合はSet[String])を保持できます。

この計算はすべて、型レベルの関数を使用して、コンパイル時、より正確には型チェック時間の間に行われます。したがって、型が実際に計算され、設計時にわからない場合でも、型セーフであることが静的に保証されます。

36
Jörg W Mittag

私の ブログ投稿 Scala型システムでSKI微積分をエンコードすると、チューリング完全性が示されます。

いくつかの単純な型レベルの計算では、自然数と加算/ 乗算 をエンコードする方法に関する例もいくつかあります。

最後に、Apocalispのブログに、型レベルのプログラミングに関するすばらしい 一連の記事 があります。

34
michid