Scalaの型システムはチューリング完全であるという主張があります。私の質問は次のとおりです。
これの正式な証明はありますか?
Scala型システムでの単純な計算はどのようになりますか?
これはScala(言語)にとって何かメリットがありますか?これにより、チューリング完全型システムのない言語と比較して、Scalaは何らかの形でより「強力」になりますか?
これは一般的に言語と型システムに当てはまると思います。
Scalaの型システムはチューリング完全であるという主張があります。私の質問は次のとおりです。
これの正式な証明はありますか?
Scala型システムでの単純な計算はどのようになりますか?
これはScala(言語)にとって何かメリットがありますか?これにより、チューリング完全型システムのない言語と比較して、Scalaは何らかの形でより「強力」になりますか?
これは一般的に言語と型システムに当てはまると思います。
チューリング完全であることが知られている SKI コンビネータ計算の型レベルの実装に関するブログ投稿がどこかにあります。
チューリング完全型システムには、チューリング完全言語と基本的に同じ長所と短所があります。何でもできますが、証明できることはほとんどありません。特に、実際に最終的に何かを行うことを証明することはできません。
型レベルの計算の一例は、Scala 2.8 の新しい型保持コレクション トランスフォーマーです。Scala 2.8 では、 などのメソッドはmap
、filter
呼び出されたのと同じ型のコレクションを返すことが保証されています。したがって、あなたがfilter
aなら a をSet[Int]
返し、あなたがaSet[Int]
ならaを返します。map
List[String]
List[Whatever the return type of the anonymous function is]
ご覧のとおり、map
実際に要素の型を変換できます。では、新しい要素の型が元のコレクションの型で表現できない場合はどうなるでしょうか? 例: a にBitSet
は、固定幅の整数のみを含めることができます。では、 があり、BitSet[Short]
各数値をその文字列表現にマップするとどうなるでしょうか?
someBitSet map { _.toString() }
結果はになりますがBitSet[String]
、それは不可能です。そのため、Scala は、BitSet
を保持できるの最も派生したスーパータイプ (String
この場合は ) を選択しSet[String]
ます。
この計算はすべて、コンパイル時、またはより正確には型チェック時に、型レベル関数を使用して行われます。したがって、型が実際に計算され、設計時に不明であっても、型安全であることが静的に保証されます。
Scala型システムでのSKI微積分のエンコードに関する私のブログ投稿は、チューリング完全性を示しています。
いくつかの単純な型レベルの計算では、自然数と加算/乗算をエンコードする方法に関する例もいくつかあります。
最後に、Apocalispのブログに、タイプレベルのプログラミングに関するすばらしいシリーズの記事があります。