/ / Come vincolare il tipo come membro del tipo astratto in tratto? - scala, tipi, tratti

Come vincolare il tipo come membro del tipo astratto in tratto? - scala, tipi, tratti

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 № 1

Se 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.