Sto sperimentando tipi dipendenti dal percorso e ho riscontrato un problema durante il tentativo di scrivere un'istanza scalaz.Equal
per questo. Ho la seguente struttura:scalaz.Equal per tipi dipendenti dal percorso
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
primo luogo ho voluto fare b1
"unequalable" (che è una parola?) Per b2
al momento della compilazione, che ho raggiunto con il seguente:
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
mio secondo esperimento è stato cercare di rendere l'uguaglianza meno restrittive, consentendo istanze di A#B
da confrontare tra di loro, ma non ad altri tipi, con:
implicit val BEqual: scalaz.Equal[A#B] = Equal.equalA
Ma non funziona come previsto:
b1 === b2 //doesnt' compile, === is not a member of a1.B
Questo funziona però:
BEqual.equal(b1,b2) //compiles
BEqual.equal(b1,"string") //doesnt' compile, good
Quindi, vorrei sapere perché il ===
non funziona e se posso scrivere un caso di Equal
applicabile a tutti gli A#B
s?
Ho provato una soluzione di birra fatta in casa con conversione implicita e ha funzionato.
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
Quindi, perché questo non funziona con scalaz.Equal
?
"e' Equal' è invariante nel suo parametro tipo ". Proprio lì, quello era il dettaglio che trascuravo! Sono d'accordo che non voglio lavorarci sopra, è il comportamento corretto! Grazie! – Chirlo