【问题标题】:Initial value (0) for numeric parameterized type数值参数化类型的初始值 (0)
【发布时间】:2012-09-25 19:35:04
【问题描述】:

考虑一下,我想实现一些功能,将Long => T 应用于整数范围a..b 并累积T 类型的结果(这是练习,而不是寻找有效的解决方案)

def sum[T <: Number](f: Long => T)(a: Long, b: Long): T = {
  def loop(acc: T, n: Long): T = 
    if (n > b)
      acc
    else
      loop(acc + f(n), n + 1)

  loop(0, a)
}

loop(0, 抱怨的缺陷

error: type mismatch;
 found   : Int(0)
 required: T
     loop(0, a)

我明白为什么,但是在这里给数字类型T 0 的选项是什么?如果有的话,当然可以。

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    您应该为您的泛型T 使用Numeric 类型类。这将使您能够访问方法 zeroplus(因为每个 Numeric 都必须定义这些),这将允许您一般地执行求和。

    def sum[T](f: Long => T)(a: Long, b: Long)(implicit num: Numeric[T]): T = {
      def loop(acc: T, n: Long): T =
        if (n > b)
          acc
        else
          loop(num.plus(acc, f(n)), n + 1)
    
      loop(num.zero, a)
    }
    

    顺便说一句:这就是 Scala 内置的 sum 方法所做的:

    // from TraversableOnce
    def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)
    

    【讨论】:

    • 在这个答案中:stackoverflow.com/a/4034176/978664 显示了一些语法糖,因此类型参数可能被指定为 [T : Numeric]val num = implicitly[Numeric[T]]。只是为了协议。
    猜你喜欢
    • 1970-01-01
    • 2022-08-19
    • 2015-02-25
    • 2020-11-09
    • 2022-12-13
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多