【发布时间】:2019-11-30 05:19:12
【问题描述】:
我想将case class Bonus[A: Numeric](amt: A) 映射到 Functor 上,但它失败了。编译错误是
Error:(157, 69) could not find implicit value for evidence parameter of type Numeric[B] (No implicit Ordering defined for B.)
override def fmap[A, B](fa: Bonus[A])(f: A => B): Bonus[B] = Bonus(f(fa.amt))
一般情况下,我想将Bonus 中的参数类型固定为数字。我该如何解决这个问题?谢谢
代码sn-p,
trait Functor[F[_]] {
def fmap[A, B](fa: F[A])(f: A => B): F[B]
}
def fmap[A, B, F[_]](fa: F[A])(f: A => B)(implicit ev: Functor[F]): F[B] = ev.fmap(fa)(f)
case class Bonus[A: Numeric](amt: A)
implicit val bonusFunctor = new Functor[Bonus] {
override def fmap[A, B](fa: Bonus[A])(f: A => B): Bonus[B] = Bonus(f(fa.amt)) // error
}
fmap(Bonus(123))(_ * 2)
更新 1
感谢 Mario 和 Dmytro 的回答。
Dmytro,您的答案与我在https://users.scala-lang.org/t/how-to-add-type-constraint-to-functors-map-function/2055 找到的完全一样。要么我放弃约束,要么我使用约束 Functor,这是有道理的。我接受了 Mario 的回答,因为它向我展示了另一种解决方案,因为 Functor 无法实现。
【问题讨论】:
-
我认为问题在于
B没有Numeric[B]的隐式转换,这是您的Bonus课程所要求的