2015-04-06 3 views
0

Учитывая следующий trait (от этой полезной shapeless talk):Черта с высшим Kinded типами

scala> trait NatT[F[_], G[_]] { def apply[T](f: F[T]): G[T] } 
warning: there were two feature warnings; re-run with -feature for details 
defined trait NatT 

Я считаю, что это означает, что NatT принимает два высших-kinded параметров: F и G.

С этим предположением, я пытался сделать экземпляр, где F и G имеют тип Option:

scala> case object Maybe extends NatT[Option, Option] { 
    | override def apply(f: Option[Int]) = f 
    | } 
<console>:8: error: object creation impossible, since method apply in trait NatT of type [T](f: Option[T])Option[T] is not de 
fined 
     case object Maybe extends NatT[Option, Option] { 
       ^
<console>:9: error: method apply overrides nothing. 
Note: the super classes of object Maybe contain the following, non final members named apply: 
def apply[T](f: Option[T]): Option[T] 
     override def apply(f: Option[Int]) = f 
        ^

Как я могу исправить эту попытку сделать Maybe экземпляр?

ответ

6

Ваш метод apply отсутствует параметр типа. Просто как тот.

case object Maybe extends NatT[Option, Option] { 
    def apply[A](f: Option[A]): Option[A] = f 
} 

Ваши попытки определить apply без параметра типа рассматриваются как другой метод, так что кажется, что apply является невыполненной. Учитывая, что F и G должны быть более высокого рода, на самом деле не имеет смысла пытаться их исправить до Option[Int].

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