如何将类型约束添加到仿函数映射函数

时间:2017-12-08 08:31:48

标签: scala functor applicative type-level-computation

我无法为具有类型约束的Functor定义abstract class Foo[V : Monoid]。这是因为map Functor方法采用的B参数不是Monoid

我的问题是我如何以及在哪里可以添加这样的约束?

以下是我正在尝试做的一个示例:

import cats.Functor
import cats.kernel.Monoid

abstract class Foo[A : Monoid] {
  val a: A
}

object Foo {
  implicit def FooFunctor = new Functor[Foo] {
    override def map[A, B](fa: Foo[A])(f: (A) => B) = new Foo[B] {
      override val a: B = f(fa.a)
    }
  }
}

这引发了以下异常:

Error:(12, 59) could not find implicit value for evidence parameter of type cats.kernel.Monoid[B]
    override def map[A, B](fa: Foo[A])(f: (A) => B) = new Foo[B] {

我的第一个解决方案是在map定义(override def map[A, B : Monoid])中添加约束,但这不合法,因为这会改变Functor中函数的定义并引发异常:

Error:(12, 18) method map overrides nothing.

任何人都可以帮我摆脱这个吗?任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为主要的问题是你试图将子类型与类型类混合。应该是:

trait Foo[A] extends Monoid[A] with Functor[A] {
  val a: A
}

trait SomeADT
case class SomeValue(a: String) extends SomeADT

object SomeADT {
  //evidence
}