24

with traits を使用し、構造型を型パラメーターの制約として使用するコードの一部に、再帰的な構造型が必要でした。問題なく動作しましたが、後で 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
4

2 に答える 2

6

これはコンパイラの不具合だと思います。次のコードは、最初のコードと同じ動作を示します。

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

唯一の違いは、ここでは型エイリアス S を介して構造型付けが適用されることです。

于 2010-11-16T21:36:10.293 に答える
0

最初のコード スニペットも、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 を使用していますか?

于 2010-11-09T18:39:39.933 に答える