带有函子的数值映射

thl*_*lim 4 scala functor typeclass

我想映射case class Bonus[A: Numeric](amt: A)一个函子但失败了。编译错误是

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))
Run Code Online (Sandbox Code Playgroud)

一般来说,我想将参数类型固定为Bonus数字。我该如何解决这个问题?谢谢

代码片段,

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)
Run Code Online (Sandbox Code Playgroud)

更新1

谢谢MarioDmytro的回答。

Dmytro,您的答案正是我在https://users.scala-lang.org/t/how-to-add-type-constraint-to-functors-map-function/2055中找到的答案。要么放弃约束,要么使用约束函子,这是有意义的。我接受了 Mario 的回答,因为它向我展示了一种替代解决方案,因为 Functor 不可能做到这一点。

Dmy*_*tin 5

类型类的实例Functor不能为任何类型构造函数定义。

事实上,类型构造函数F[_]具有类型类的实例,Functor这意味着对于任何A具有B函数的A => B, 您知道如何转换F[A]F[B]

但如何转化Bonus[A]Bonus[B] for any A,B

类型对任何类型Bonus[A]都有Bonus[B]意义AB即使它们不是Numeric,但通过构造函数创建新实例Bonus[B]仅对B: Numeric.

删除绑定Numeric在 .case class Bonus[A: Numeric](amt: A)Bonus不是 . 中的上下文Functor

如果您定义自己的类型类

trait NumericFunctor[F[_]] {
  def fmap[A: Numeric, B: Numeric](fa: F[A])(f: A => B): F[B]
}
Run Code Online (Sandbox Code Playgroud)

它不是类型类别上的标准函子,而是类型类别上的自定义函子Numeric