Vorrei definire la seguente caratteristica con un tipo astratto:
trait C {
type M[_]
def doSomething(m: M[T]): M[T] = ???
def somethingElse: M[T] = ???
}
Mi piacerebbe vincolare il mio tipo più alto M
avere un scalaz.Monad[M]
esempio. Una soluzione sarebbe cambiare il mio codice come:
abstract class C[M: Monad] { ... }
ma vorrei che M fosse un membro di tipo astratto. È possibile in Scala?
risposte:
1 per risposta № 1Se vuoi richiedere un Monad[M]
esempio, solo ... lo richiedono:
trait C {
type M[_]
/*implicit if you like*/ def m: Monad[M]
...
}
Le classi di implementazione dovranno purtroppo specificare m, se non altro val m = implicitly
; l'unico modo per aggirare questo è il abstract class
approccio che dici.