gpt4 book ai didi

scala - 如何向仿函数映射函数添加类型约束

转载 作者:行者123 更新时间:2023-12-02 04:32:06 25 4
gpt4 key购买 nike

我无法为具有类型约束的 abstract class Foo[V : Monoid] 定义 Functor。这是因为 Functormap 方法采用 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.

谁能帮我解决这个问题?任何建议将不胜感激。

最佳答案

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

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

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

object SomeADT {
//evidence
}

关于scala - 如何向仿函数映射函数添加类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47710398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com