Ich experimentiere mit pfadabhängigen Typen und stoße auf ein Problem, wenn ich versuche, eine scalaz.Equal
Instanz dafür zu schreiben. Ich habe die folgende Struktur:scalaz.Equal für pfadabhängige Typen
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
ich zum ersten Mal b1
„unequalable“ machen wollte (ist das ein Wort?) Zu b2
bei der Kompilierung, die ich mit folgenden erreicht:
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
Meinem zweiter Versuch war versuchen, Gleichheit weniger restriktiv, so dass Instanzen von A#B
zu machen miteinander verglichen werden, aber nicht auf andere Arten, mit:
implicit val BEqual: scalaz.Equal[A#B] = Equal.equalA
Aber es wie erwartet funktioniert nicht:
b1 === b2 //doesnt' compile, === is not a member of a1.B
Dies funktioniert jedoch:
BEqual.equal(b1,b2) //compiles
BEqual.equal(b1,"string") //doesnt' compile, good
So würde ich gerne wissen, warum die ===
nicht funktioniert und wenn ich eine Instanz schreiben von Equal
das würde für alle A#B
s gelten?
Ich versuchte eine Hausbraulösung mit impliziter Konvertierung und es funktionierte.
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
Warum also nicht diese Arbeit mit scalaz.Equal
?
"und" Equal "ist invariant in seinem Typparameter". Genau da war das Detail, das ich übersehen habe! Ich stimme zu, dass ich nicht daran arbeiten möchte, es ist das richtige Verhalten! Vielen Dank! – Chirlo