Scalaのタイプシステムは完全にチューリングされています。証拠?例?利点?
-
27-09-2019 - |
質問
Scalaのタイプシステムが完全にチューリングされているという主張があります。私の質問は次のとおりです。
これの正式な証拠はありますか?
SCALAタイプシステムでは、単純な計算はどのように見えますか?
これはScalaにとって何らかの利点ですか?言語ですか?これにより、Scalaは、チューリング完全なタイプシステムなしで言語を何らかの形でより「強力」にしていますか?
これは、一般的に言語とタイプシステムに適用されると思います。
解決
Ski Combinator Calculusのタイプレベルの実装があるブログ投稿があります。
チューリング完了タイプのシステムには、基本的に同じ利点と欠点があります。特に、実際に最終的に何かをすることを証明することはできません。
タイプレベルの計算の1つの例は、SCALA 2.8の新しいタイプを提供するコレクショントランスです。 Scala 2.8では、のような方法 map
, filter
そのように、彼らが呼ばれたのと同じタイプのコレクションを返すことが保証されています。だから、もしあなたの場合 filter
a Set[Int]
, 、あなたは戻ってきます Set[Int]
そしてもしあなたが map
a List[String]
あなたは戻ってきます List[Whatever the return type of the anonymous function is]
.
今、あなたが見ることができるように、 map
実際に要素タイプを変換できます。では、新しい要素タイプを元のコレクションタイプで表現できない場合はどうなりますか?例:a BitSet
固定幅の整数のみを含めることができます。したがって、あなたが持っている場合はどうなりますか BitSet[Short]
そして、各番号をその文字列表現にマッピングしますか?
someBitSet map { _.toString() }
結果 します a BitSet[String]
, 、しかしそれは不可能です。したがって、Scalaは最も派生したスーパータイプを選択します BitSet
, 、aを保持できます String
, 、この場合、これはaです Set[String]
.
この計算はすべて中に行われています 時間をまとめます, 、またはより正確に タイプチェック時間, 、タイプレベルの関数を使用します。したがって、タイプが実際に計算されているため、設計時には知られていない場合でも、タイプセーフであることが静的に保証されています。