【问题标题】:Dependent type and dependee in arguments to function in scalascala中函数的依赖类型和依赖者
【发布时间】:2019-03-12 02:31:38
【问题描述】:

我想在 Scala 中这样做:

def sum[T](seq: Seq[T]): T =
  seq match {
    case last :: Nil => last
    case head :: tail => head + sum(tail)
  }

但是 Scala 抱怨 sum(tail) 上存在类型不匹配:它期待 String 但得到了 T - 这听起来当然不对。我调查了一下,看起来 Scala 的类型推断系统只能推断出tail 的类型是Seq[Any]。是这个问题吗?在 Scala 中编写此代码的正确方法是什么?

【问题讨论】:

    标签: scala types


    【解决方案1】:

    问题在于编译器不知道方法+ 是否可用于类型T。关于String 的业务具有误导性。它只是默认假设 + 应该是 String 连接。

    如果您将T 限制为只能是一些可以相加的数字类型,那么它将起作用。

    def sum[T:Numeric](seq: Seq[T]): T =
      seq match {
        case last :: Nil => last
        case head :: tail => implicitly[Numeric[T]].plus(head, sum(tail))
      }
    

    通过添加导入可以更简洁地表达。

    def sum[T:Numeric](seq: Seq[T]): T = {
      import Numeric.Implicits._
      seq match {
        case last :: Nil => last
        case head :: tail => head + sum(tail)
      }
    }
    

    另外,:: 用于List 操作。因为您的方法适用于SeqList,但不适用于Vector。将:: 更改为更通用的+:,它将适用于更多的集合类型,如VectorArray 等。

    【讨论】:

    • import Numeric.Implicits._ 似乎没有为我解决这个问题。
    • 在尝试import 改进之前,您是否尝试过第一次修复?这两个示例都在我的 IDE 上进行了测试。
    • 好的——现在我两个都开始工作了。不过第一个真的很丑。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多