Instancia de Functor para Type Constructor con dos parámetros en Scala
Tengo una claseFoo
con dos parámetros, y estoy tratando de escribir una instancia de Functor para Foo con el primer parámetro fijo, de la siguiente manera:
object Scratchpad {
trait Functor[F[_]] {
def fmap[A, B](f: A => B): F[A] => F[B]
}
case class Foo[X, Y](value: Y)
implicit def fooInstances[X]: Functor[Foo[X, _]] =
new Functor[Foo[X, _]] {
def fmap[A, B](f: A => B): Foo[X, A] => Foo[X, B] =
foo => Foo[X, B](f(foo.value))
}
}
Pero el código anterior no se compila, generando el siguiente error:
Error:(9, 41) Scratchpad.Foo[X, _] takes no type parameters, expected: one
implicit def fooInstances[X]: Functor[Foo[X, _]] =
Sé que Scalaz hace algo así con sus\/
tipo, pero la inspección de su código fuente revela un extraño?
, que no se compila para mí:
implicit def DisjunctionInstances1[L]: Traverse[L \/ ?] with Monad[L \/ ?] with BindRec[L \/ ?] with Cozip[L \/ ?] with Plus[L \/ ?] with Optional[L \/ ?] with MonadError[L \/ ?, L] =
¿Cómo funciona el Scalaz?
trabajo, y cómo puedo escribir una instancia de Functor paraFoo
?