2014-12-26 2 views
1

Я хотел бы определить следующую черту с абстрактным типом:Как ограничить тип как абстрактный тип члена в черту?

trait C { 
    type M[_] 

    def doSomething(m: M[T]): M[T] = ??? 
    def somethingElse: M[T] = ??? 
} 

Я хотел бы, чтобы ограничить мой высокий тип M иметь scalaz.Monad[M] экземпляр. Одним из решений было бы изменить мой код:

abstract class C[M: Monad] { ... } 

, но я хотел бы, чтобы M был абстрактным членом. Возможно ли это в Scala?

ответ

1

Если вы хотите, чтобы потребовать Monad[M] экземпляр, просто ... требуют:

trait C { 
    type M[_] 
    /*implicit if you like*/ def m: Monad[M] 
    ... 
} 

Реализация классов будет, к сожалению, придется указать м, если только val m = implicitly; единственный способ, который стоит упомянуть, - это подход abstract class.

+0

Это единственный вариант. Мне бы хотелось избежать переопределения –

Смежные вопросы