gpt4 book ai didi

scala - 带有仿函数的数值映射

转载 作者:行者123 更新时间:2023-12-01 09:41:58 25 4
gpt4 key购买 nike

我要 map 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 中的参数类型到数字。我该如何解决?谢谢

代码片段,
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 为您解答。

Dmytro,您的答案与我在 https://users.scala-lang.org/t/how-to-add-type-constraint-to-functors-map-function/2055 中找到的完全一样.要么我放弃约束,要么使用约束 Functor,这是有道理的。我接受了马里奥的回答,因为它向我展示了另一种解决方案,因为 Functor 不可能。

最佳答案

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

类型构造函数 F[_]有类型类的实例 Functor表示 对于任何 A , B , 具有函数 A => B ,你知道如何转换F[A]F[B] .

但是如何改造Bonus[A]Bonus[B] 对于任何 A , B ?

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

要么删除上下文绑定(bind)Numericcase 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]
}

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

关于scala - 带有仿函数的数值映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59113417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com