gpt4 book ai didi

scala - 在 scala 中函数的参数中的依赖类型和依赖者

转载 作者:行者123 更新时间:2023-12-02 08:04:52 24 4
gpt4 key购买 nike

我想在 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 的类型推断系统只能推断出 tailSeq[Any] 类型。那是问题吗?在 Scala 中写这个的正确方法是什么?

最佳答案

问题是编译器不知道方法 + 是否可用于类型 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

关于scala - 在 scala 中函数的参数中的依赖类型和依赖者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52684998/

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