質問

特性を使用して、型パラメーター制約として構造タイプを使用して、いくつかのコードに再帰的な構造タイプが必要でした。うまくいきましたが、後で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を使用していますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top