假设我要为Seq实现一个映射。
trait Functor2[F[_]] {
def map1[A,B](fa : F[A])(func: A => B) : F[B]
}
case class SeqFunctor1[A](fa: Seq[A]) extends Functor2[Seq] {
override def map1[A, B](fa: Seq[A])(func: A => B) : Seq[B] = fa map func
}
我可以通过
进行呼叫val list = List(1,2,3,4)
val f1 : Int => Int = (i : Int) => i * 10
SeqFunctor1(list).map1(list)(f1).
我不喜欢必须两次使用列表的事实。所以我尝试
trait Functor3[F[_]] {
def map1[A,B](func: A => B) : F[B]
}
case class SeqFunctor2[A](fa: Seq[A]) extends Functor3[Seq] {
override def map1[A, B](func: A => B) : Seq[B] = fa map func
}
以便我可以通过它使用
SeqFunctor2(list).map1(f1)
我收到此错误
Error:(45, 59) type mismatch;
found : A(in method map1) => B
required: A(in class SeqFunctor2) => ?
override def map1[A, B](func: A => B) : Seq[B] = fa map func
我知道您可以通过一个对象来实现它,但是很高兴知道如何通过case类来使用它(这也是一种比起作用的方法更好的方法)。
答案 0 :(得分:3)
您正在用A
定义之一遮盖案例类定义中的map
。您可以这样做:
trait Functor3[F[_], A] {
def map1[B](func: A => B) : F[B]
}
case class SeqFunctor2[A](fa: Seq[A]) extends Functor3[Seq, A] {
override def map1[B](func: A => B) : Seq[B] = fa map func
}
val list = List(1,2,3,4)
val f1 : Int => Int = (i : Int) => i * 10
SeqFunctor2(list).map1(f1)
但是为什么要把Functor作为案例类呢?您真的只需要一个实例。