【问题标题】:Scala parameterized methods and arithmetic operationsScala 参数化方法和算术运算
【发布时间】:2011-01-17 02:37:00
【问题描述】:

我正在尝试让一个简单的功能在我有一个列表列表的情况下工作,并且我想对数据(-、+、*、/)进行一些数学运算。我希望该方法采用以下任何类型(Int、Float、Double)。

这是我尝试过的:

def doSomething[T](data: List[T]){
 data reduceLeft(_ / _)
}

显示如下:值/不是类型参数T的成员。

如何让它适用于 AnyVal 类型(Double、Int、Float)?

更新我尝试在以下代码中实施建议:

def dot[T](l: List[List[T]])(implicit num: Numeric[T]) = 
{

    for (row <- data)
        yield for(col <- l)
            yield row zip col map {a => num.times(a._1 , a._2)}   reduceLeft (_+_)

并得到错误:类型不匹配;找到:a._1.type(带有底层类型 T) 需要:T

有什么办法可以解决吗?

【问题讨论】:

  • 第一个 for 中的 data 是什么?
  • 抱歉数据是一个List[List[T]]。
  • 我想出了一种方法,就是将它包含在参数化类中。但是,我仍然想知道为什么上述方法不起作用?特别是如果我想将此方法用作函数对象。
  • 这似乎行不通,因为times 要求两个参数的类型相同,在这种情况下,不能保证data 的基础类型T 和dot的类型 T 是同一类型。如果您想避免参数化类,请尝试传递给函数data 参数以及
  • 例如def dot[T](data: List[List[T]])(l: List[List[T]])(implicit num: Numeric[T]) = ...,然后使用dot(data) _

标签: scala


【解决方案1】:

除法:

def foo[T](l: List[T])(implicit num: Numeric[T]) = num match{
     case i: Integral[_] => l reduceLeft (i.quot(_, _))
     case fr: Fractional[_] => l reduceLeft (fr.div(_, _))}

对于 +、- 和 *,它更容易(分别为 plusminustimes):

def foo[T](l: List[T])(implicit num: Numeric[T]) = l reduceLeft (num.plus(_, _))

【讨论】:

  • 需要说明的是,这里看到的通常被称为“(隐式)类型类模式”。参见例如java.dzone.com/articles/scala-implicits-type-classes
  • 太棒了!感谢您的帮助。
  • 现在问题似乎在于将元组值与 Numeric 一起使用。我已经更新了我的示例以显示问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多