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)
谢谢Mario和Dmytro的回答。
Dmytro,您的答案正是我在https://users.scala-lang.org/t/how-to-add-type-constraint-to-functors-map-function/2055中找到的答案。要么放弃约束,要么使用约束函子,这是有意义的。我接受了 Mario 的回答,因为它向我展示了一种替代解决方案,因为 Functor 不可能做到这一点。
类型类的实例Functor不能为任何类型构造函数定义。
事实上,类型构造函数F[_]具有类型类的实例,Functor这意味着对于任何A具有B函数的A => B, 您知道如何转换F[A]为F[B]。
但如何转化Bonus[A]为Bonus[B] for any A,B?
类型对任何类型Bonus[A]都有Bonus[B]意义A,B即使它们不是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。
| 归档时间: |
|
| 查看次数: |
149 次 |
| 最近记录: |