带函子的数字映射

问题描述 投票:3回答:2

我想在函子上映射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))

[通常,我想将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)

更新1

谢谢Mario和Dmytro的回答。

Dmytro,您的回答与我在https://users.scala-lang.org/t/how-to-add-type-constraint-to-functors-map-function/2055处发现的完全一样。我放弃约束或使用约束函子是有意义的。我接受了Mario的回答,因为它为我显示了替代解决方案,因为Functor无法实现。

我想在Functor上映射案例类Bonus [A:Numeric](amt:A),但失败。编译错误为错误:(157,69)找不到类型为Numeric [B](No ...

scala typeclass functor
2个回答
1
投票

尝试


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.