Scalaの(再帰的)構造タイプについての面白い観察
-
30-09-2019 - |
質問
特性を使用して、型パラメーター制約として構造タイプを使用して、いくつかのコードに再帰的な構造タイプが必要でした。うまくいきましたが、後でScalaが再帰的な構造タイプをサポートしていないことを学びました。
だから誰かが私にこれがうまくいく理由を説明できますか:
scala> trait Test[M[A] <: { def map[B](f: A => B) : M[B] } ] {}
defined trait Test
これはそうではありません:
scala> def test[M[A] <: { def map[B](f: A => B) : M[B] } ] = null
<console>:5: error: illegal cyclic reference involving type M
def test[M[A] <: { def map[B](f: A => B) : M[B] } ] = null
解決
これはコンパイラのグリッチだと思います。次のコードは、最初のコードと同じ動作を示します。
trait Test[M[A] <: { def map: M[A] } ] {}
def test[M[A] <: { def map: M[A] } ] = null
その結果、コンパイル時間エラー:「違法環状参照」が発生します。
そして、次のコードはありません(つまり、それは正常にコンパイルされます):
type S[M] = { def map: M }
trait Test[M[A] <: S[M[A]] ] {}
def test[M[A] <: S[M[A]] ] = null
唯一の違いは、構造タイピングがここでタイプエイリアスを介して適用されることです。
他のヒント
最初のコードスニペットは、Scala 2.7.7finalでエラーをスローします。
scala> trait Test[M[A] <: { def map[B](f: A => B) : M[B] } ] {}
<console>:4: error: illegal cyclic reference involving type M
trait Test[M[A] <: { def map[B](f: A => B) : M[B] } ] {}
^
どのバージョンのScalaを使用していますか?
所属していません StackOverflow