我无法为具有类型约束的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.
任何人都可以帮我摆脱这个吗?任何建议将不胜感激。
答案 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
}