在泛型类型必须支持add或+函数的地方使函数泛型

时间:2018-08-16 09:58:21

标签: scala

我在Scala中有两个案例类,如下所示:

case class User(name:String, countA:Int, countB:Int)

case class Store(l: User, a: Iterable[User], b: Iterable[User]) {

  def longFoldLeft(s: Long)(f: (Long, User) => Long): Long = {
    val foldLeftB = b.foldLeft(s)(f)
    val foldLeftA = a.foldLeft(foldLeftB)(f)
    val result = f(foldLeftA, l) 
    result
  }
}

如您所见,我想在 Store 类中创建一个函数,该函数在a和b上执行foldLeft,最后将结果附加在 l 上。

现在,我要确保结果类型支持 + 方法。在scala中有可能吗?如果是,那怎么办?

2 个答案:

答案 0 :(得分:3)

您可以使用结构性键入:

def longFoldLeft[T <: { def +(v: T): T}](s: T)(f: (T, User) => T): T = {
  f(lead)  + typeA.foldLeft(typeB.foldLeft(s)(f))(f)
}

另请参阅:https://alvinalexander.com/scala/how-to-use-duck-typing-in-scala-structural-types

答案 1 :(得分:1)

我建议将Long替换为不受约束的类型参数T

  def foldLeft[T](s: T)(f: (T, User) => T): T = {
    val foldLeftB = b.foldLeft(s)(f)
    val foldLeftA = a.foldLeft(foldLeftB)(f)
    f(foldLeftA, l) 
  }

如果此API的用户后来想将其与LongIntNumeric的任何子类型或存在{{3}的实例的类型},那么仍然有可能。没有理由对T施加不必要的约束。