Yol bağımlı türlerini deniyorum ve bunun için bir scalaz.Equal
örneği yazmaya çalışırken bir sorunla karşılaşıyorum. Aşağıdaki yapıya sahiptir: İlk b1
"unequalable" yapmak istedimscalaz.Equide bağımlı türler için
class A {
class B
}
val a1 = new A
val b1 = new a1.B // type a1.B
val a2 = new A
val b2 = new a2.B //type a2.B
(olduğuna dair bir haber var mı?) b2
derleme zamanında, şu elde:
import scalaz._
import Scalaz._
implicit def BEqual[X <: A#B]: scalaz.Equal[X] = Equal.equalA
b1 === b1 //true
b1 === b2 // doesn't compile, good
b2 === b1 // doesn't compile, good
Benim
implicit val BEqual: scalaz.Equal[A#B] = Equal.equalA
: ikinci deney ile birbirine ancak diğer türleriyle karşılaştırıldığında edilecek
A#B
örneklerini sağlayan eşitlik az kısıtlayıcı yapmaya oldu 10
Ama beklendiği gibi çalışmaz: Ancak bu işler
b1 === b2 //doesnt' compile, === is not a member of a1.B
: Yani
BEqual.equal(b1,b2) //compiles
BEqual.equal(b1,"string") //doesnt' compile, good
, ben ===
çalışmıyor neden bilmek istiyorum ve bir örneğini yazabilirsiniz eğer Equal
'un tamamı A#B
s için geçerli midir?
Ev içi demleme çözümünü örtülü dönüştürme ile denedim ve çalıştı.
implicit class abEqual(ab: A#B) {
def eqab(ab2: A#B) = ab == ab2
}
b1.eqab(b2) //ok
b2.eqab(b1) //ok
b1.eqab("String") //doesn't compile, good
Peki bu neden scalaz.Equal
ile çalışmıyor? BEqual
İlk olarak
"ve" Equal ", tür parametresinde değişkendir". İşte orada, gözden kaçırdığım detay buydu! Katılıyorum 'etrafta çalışmak istemiyorum, doğru davranış! Teşekkürler! – Chirlo