'da varolan daha yüksek türdeki bir türü nasıl tanımlarım Scala'da varoluşsal olarak daha iyi bir tür kabul eden bir tür tanımlamaya çalışıyordum.Scala
Ne yazık ki Scalac buna izin vermiyor.
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
trait H[F[_, _]]
trait T[A, B]
val h:H[T] = null
val e:H[F] forSome { type F[A, B] } = h
// Exiting paste mode, now interpreting.
<console>:13: error: type mismatch;
found : H[T]
required: H[_[A, B] <: Any]
Note: T <: Any, but trait H is invariant in type F.
You may wish to define F as +F instead. (SLS 4.5)
val e:H[F] forSome { type F[A, B] } = h
^
Bunu nasıl giderebilirim?
Tür parametresi ne olursa olsun herhangi bir H
ile eşleşen bir türü nasıl tanımlayabilirim?
Güncelleme: Scalac'ın varoluşsal türden çıkmasına izin vermeye çalıştım, hala şanslı değil.
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
trait H[F[_, _]]
trait T[A, B]
val h:H[T] = null
trait T2[A, B]
val h2:H[T2] = null
Seq(h, h2)
// Exiting paste mode, now interpreting.
<console>:17: error: type mismatch;
found : H[T]
required: H[_ >: T2 with T <: Object]
Seq(h, h2)
^
<console>:17: error: type mismatch;
found : H[T2]
required: H[_ >: T2 with T <: Object]
Seq(h, h2)
^
ben yapabilirsiniz sanmıyorum. Bkz. Http://stackoverflow.com/questions/3122398/cant-existentially-abstract-over-parameterized-type – sschaef
İşte garip olan şey: 'F'de' H' kovaryantı yapmak ('H = + F [_, _ ]] ') ve aniden aşağıdakileri derler:" val h2: H [Any] = null ". Evet, herhangi bir '' '' 'dır, burada bir tür ** kurucu ** beklenir. Eğer bilerek kasıtlı olup olmadığını bilen varsa (ve eğer öyleyse bunun anlamı nedir) bilmek isterim. –
@ RégisJean-Gilles Sanırım bu bir scalac hatasıdır –