Scalaの型システムはチューリング完全であるという主張があります。私の質問は次のとおりです。
これに対する正式な証明はありますか?
Scala型システムでは、単純な計算はどのようになりますか?
これはScala-言語に何らかの利点がありますか?これにより、チューリング完全型システムのない言語と比較して、Scalaが何らかの形でより「強力」になりますか?
これは一般的に言語と型システムに当てはまると思います。
チューリング完全であることが知られているSKIコンビネータ微積分のタイプレベルの実装に関するブログ投稿がどこかにあります。
チューリング完全型システムには、基本的にチューリング完全言語と同じ利点と欠点があります。何でもできますが、証明できることはほとんどありません。特に、最終的に何かをすることを証明することはできません。
タイプレベルの計算の一例は、Scala 2.8の新しいタイプ保存コレクショントランスフォーマーです。Scala 2.8、map
、 filter
などは、呼び出されたのと同じタイプのコレクションを返すことが保証されています。したがって、filter
a Set[Int]
の場合、Set[Int]
が返され、map
List[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]
)を保持できます。
この計算はすべて、型レベルの関数を使用して、コンパイル時、より正確には型チェック時間の間に行われます。したがって、型が実際に計算され、設計時にわからない場合でも、型セーフであることが静的に保証されます。