gpt4 book ai didi

scala - 通用的基于类型的函数可根据其类型对数字求和

转载 作者:行者123 更新时间:2023-12-04 13:22:28 24 4
gpt4 key购买 nike

假设x和y是同一类型,可以是BooleanIntDouble。这是我要编写的函数:

f(x, y) = 
- if x == Boolean ==> !x
- if x == Integer or x == Double ==> x+ y

执行此操作的一种方法如下。我想知道是否有人对此有更好的想法。
def fun[T](x: T, y: T): T { 
x match {
case xP: Boolean => !xP
case xP: Double => y match { case yP: Double => xP + yP }
case xP: Int => y match { case yP: Int => xP + yP }
}
}

我对此不满意的原因是 xy具有相同的类型。我不需要两个 match-case;对?

另外两件事:
  • 仅仅设置[T <: Int, Double, Boolean]就足以将类型限制为三种类型就足够了吗?
  • 输出类型需要再次为T
  • 最佳答案

    这正是类型类旨在解决的问题。在您的情况下,您可以编写如下内容:

    trait Add[A] {
    def apply(a: A, b: A): A
    }

    object Add {
    implicit val booleanAdd: Add[Boolean] = new Add[Boolean] {
    def apply(a: Boolean, b: Boolean): Boolean = !a
    }

    implicit def numericAdd[A: Numeric]: Add[A] = new Add[A] {
    def apply(a: A, b: A): A = implicitly[Numeric[A]].plus(a, b)
    }
    }

    类型为 Add[X]的值描述了如何添加类型为 X的两个值。对于希望对其执行此操作的每种 Add[X]类型,将 X类型的隐式“实例”放入作用域中。在这种情况下,我提供了 Boolean的实例以及具有 scala.math.Numeric实例(由标准库提供的类型类)的任何类型的实例。如果只需要 IntDouble的实例,则可以简单地省略 numericAdd并编写自己的 Add[Int]Add[Double]实例。

    您可以这样编写 fun:
    def fun[T: Add](x: T, y: T) = implicitly[Add[T]].apply(x, y)

    并像这样使用它:
    scala> fun(true, false)
    res0: Boolean = false

    scala> fun(1, 2)
    res1: Int = 3

    scala> fun(0.01, 1.01)
    res2: Double = 1.02

    这具有非常显着的优点,即在运行时不会为尚未定义操作的类型爆炸。当您通过例如,而不是使用 MatchError异常使程序崩溃时将两个字符串添加到 fun,您会遇到不错的编译失败:
    scala> fun("a", "b")
    <console>:14: error: could not find implicit value for evidence parameter of type Add[String]
    fun("a", "b")
    ^

    通常,“类型大小写”匹配(即看起来像 case x: X => ...的匹配)在Scala中是个坏主意,并且几乎总会有更好的解决方案。通常会涉及类型类。

    关于scala - 通用的基于类型的函数可根据其类型对数字求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35384185/

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