Scala

5

'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) 
      ^
+0

ben yapabilirsiniz sanmıyorum. Bkz. Http://stackoverflow.com/questions/3122398/cant-existentially-abstract-over-parameterized-type – sschaef

+0

İş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. –

+0

@ RégisJean-Gilles Sanırım bu bir scalac hatasıdır –

cevap

0

Muhtemelen sschaef haklı, bu mümkün değil. Ben varoluşsal yüksek kinded türleri (oradan ve anlaşılmaktadır) tip desen yazılabilir bulundu

type F[A,B] = X[A,B] forSome { type X[A,B] } // alias 

trait H[F[_, _]] 
trait T[A, B] 
val h: H[T] = null 

val e: H[F] = h.asInstanceOf[H[F]] 
0

:

def toExistential[F[_, _]](h: H[F]) = h.asInstanceOf[Any] match { 
    case x: H[_] => x 
} 

> val h = new H[T] {} 
h: H[T] = [email protected] 
> val f = toExistential(h) 
f: H[_] = [email protected] 

The şu herhangi bir şekilde yardımcı olur bilmiyorum Any'a dökmek gerekli gibi görünüyor, ama en azından bir işlevde kapsüllenmiş olabilir. Bunun yerine bir tür üyesini kullanabileceği bir tip parametresinin

0

:

trait H { 
    type F[_, _] 
}