通过案例类在scala中实现高级类型

时间:2018-11-14 08:05:08

标签: scala

假设我要为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类来使用它(这也是一种比起作用的方法更好的方法)。

1 个答案:

答案 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作为案例类呢?您真的只需要一个实例。