问题描述
我想在函子上映射case class Bonus[A: Numeric](amt: A)
,但失败.编译错误是
I want to map case class Bonus[A: Numeric](amt: A)
over a Functor and it fails. The compilation error is
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
中的参数类型固定为数字.我该如何解决?谢谢
In general, I want to fix the parameter type in Bonus
to numbers. How do I do fix that? Thanks
代码段
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
谢谢您马里奥& Dmytro 为您提供答案.
Update 1
Thank you Mario & Dmytro for your answers.
Dmytro,您的答案与我在 https://users.scala-lang.org/t/how-to-add-type-constraint-functors-map-function/2055 .我放弃约束或使用约束函子是有意义的.我接受了Mario的回答,因为它向我展示了一种替代解决方案,因为Functor无法实现.
Dmytro, your answer is precisely as what I found at https://users.scala-lang.org/t/how-to-add-type-constraint-to-functors-map-function/2055. It makes sense that either I drop the constraint or I use a constraint Functor. I accepted Mario's answer because it shows me an alternative solution because it is not possible with Functor.
推荐答案
尝试
trait GFunctor[F[_], G[_]] {
def fmap[A, B](fa: F[A])(f: A => B)(implicit ga: G[A], gb: G[B]) : F[B]
}
def fmap[A, B, F[_], G[_]](fa: F[A])(f: A => B)(implicit ev: GFunctor[F, G], ga: G[A], gb: G[B]): F[B] = ev.fmap(fa)(f)
case class Bonus[A: Numeric](amt: A)
implicit val bonusFunctor = new GFunctor[Bonus, Numeric] {
override def fmap[A, B](fa: Bonus[A])(f: A => B)(implicit numA: Numeric[A], numbB: Numeric[B]): Bonus[B] = Bonus(f(fa.amt))
}
fmap(Bonus(123))(_ * 2)
输出
res0: Bonus[Int] = Bonus(246)
请注意,我们如何通过
(implicit ga: G[A], gb: G[B])
这篇关于函子上的数字映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!