2017-10-26 13 views
1

次のコード共分散と高kindedタイプ2.12

type Id[+A] = A 
type ReprF[A, F[_]] = Unit 
type Repr[A] = ReprF[A, Id] 

covariant type Id occurs in invariant position in type 
[A]Playground.this.ReprF[A,Playground.this.Id] of type Repr 

が、私は理解していないエラーで、Scalaの2.12でコンパイルできない理由Id防止の共分散このコードをコンパイルします。

ReprFFが共変であるかどうか気にしないでください。ちょうど* -> *の種類が必要です。

何か不足していますか?

奇妙なことに、Scala 2.11では奇妙なことに奇妙なことに奇妙なことにコンパイルされます。

コードで少し演奏したい場合は、これはscastie snippetです。どんな助けでも大歓迎です!

答えて

2

私は、コンパイラが共変IDによって非常に混乱していると思います。

trait Test { 
    type Id[+A] = A 
    type ReprF[+A, +F[+_]] = Unit 
    type Repr[+A] = ReprF[A, Id] 
} 

Error: covariant type Id occurs in invariant position in type [+A]Test.this.ReprF[A,Test.this.Id] of type Repr 
    type Repr[+A] = ReprF[A, Id] 

私はIDが未定義のままにした場合、それは結構です::でも、それはまだ同じエラーを与える全てが共変で

trait Test { 
    type Id[+A] 
    type ReprF[A, F[_]] = Unit 
    type Repr[A] = ReprF[A, Id] 
} 
+0

はい例はあなたのようなコード最初のスニペットから抽出しました。 非常に興味深く、あなたが第2のもので見つけたものを困惑させる! –