2011-04-03 18 views
12

umutsuzca aşağıdaki çözmeye çalışıyorum:Kısmen uygulayarak türü parametreleri

trait Access[Res[_]] { def access[C]: Res[C] } 

trait CList[C1, A] extends Access[CList[_, A]] // ?! 

def test[C1, C2, A](c: CList[C1, A]): CList[C2, A] = c.access[C2] 

scalać sadece diyor ki: "error: illegal cyclic reference involving trait CList". Bu derlemeyi nasıl yapabilirim? "Kısmi tip uygulaması" googling

cevap

13

Sen tip lambdas ilginizi çekebilir Eğer cevap kullanılan kısmi uygulama aslında implemented in scalaz olduğunu Kod daha az okunabilir olma eğiliminde olduğu için, bunun yerine tip lambdas kullanmaya başladılar .. Söz konusu yazı,

({type λ[α] = CList[α,A]})#λ 
olarak yazılabilir.

Bu, yapısal bir tür içinde parametre türü λ türünde bir tür projeksiyonu oluşturarak çalışır, böylece dış tür parametresini yakalar (bu durumda A).

Yanıtınızda açıklanan varyans ile ilgili diğer bir sorun, parametresinin Access kovaryantında yapılması ile çözülebilir. kod aşağıdaki gibi görünmelidir bu değişikliklerden sonra

:

trait Access[+Res[_]] { def access[C] : Res[C]} 

trait CList[C, +A] extends Access[({type λ[α] = CList[α,A]})#λ] 
+0

Teşekkür, biraz daha iyi görünüyor. Ayrıca benim gerçek durumumda, CList'in parametrelerinin üst sınırları olduğundan, ayrıcalıklı bir özelliği olan Partial2'ye sahip olmama gerçekten yardımcı olmadı (sınırlar için tip parametrelerini eklemem gerekecek). –

+0

Ayrıca klavyenizde genellikle lambdalar kullanılıyorsa, Aşağıdaki derleyici eklentisini düşünün: https://github.com/non/kind-projector –

2

i scala tartışma listesinde James Iry tarafından gönderildi bu çözüm buldu (http://scala-programming-language.1934581.n4.nabble.com/Partial-type-inference-td2007311.html; arg sırası değiştirilir, böylece uyarlanmış):

type Partial2[T[_,_], B] = { 
    type Apply[A] = T[A,B] 
} 
trait CList[C1, A] extends Access[Partial2[CList, A]#Apply] 

peynir louise, bu gerçekten 2011'de scala'da bunu yapmanın tek yolu nedir?

DÜZENLEME:

Bu A yılında kovaryans başarısız:.., - (

trait Access[Res[_]] { def access[C]: Res[C] } 

type Partial2[T[_,_], B] = { 
    type Apply[A] = T[A,B] 
} 
trait CList[C1, +A] extends Access[Partial2[CList, A]#Apply] 

"covariant type A occurs in invariant position" 
0

Zaten bu gerçekten eski bir soru olduğunu biliyorum ama:

trait AnyAccess { 
    type Res[X] 
    def access[Z]: Res[Z] 
} 

trait AnyCList extends AnyAccess { me => 
    type C 
    type A 
    // this could be a subtype bound instead, if needed 
    type Res[X] = AnyCList { type C = X; type A = me.A } 
} 
case object AnyCList { 
    type of[C0, +A0] = AnyCList { type C = C0; type A <: A0 } 
} 

case object buh { 

    def test[C1, C2, A](c: AnyCList.of[C1, A]): AnyCList.of[C2, A] = c.access[C2] 
} 
İlgili konular