我具有以下形式的功能:
def tTest[T](it1 : TraversableOnce[T], it2 : Option[TraversableOnce[T]] = None)
(implicit frac: Fractional[T]) = {
...
}
我的意图是这样称呼它:
tTest( Array(1.0,2,3,4), Option(Array(1.0,8,7)) )
有时也这样:
tTest( Array(1.0,2,3,4) )
第二个可以正常工作,但是当我尝试调用第一个时,得到以下信息:
scala:14: type mismatch;
found : Option[Array[Double]]
required: Option[TraversableOnce[?]]
[编辑]此代码可以正常工作:
tTest( Array(1.0,2,3,4), Option(Array(1.0,8,7).toTraversable) )
我的问题是:Scala中的Array和TraversableOnce之间是什么关系?凭直觉,我认为上面的方法应该可行,因为数组实际上至少可以遍历一次。
实际上,最简单的方法是使它适用于数组,集合,流以及任何可遍历一次的任何其他数据结构?
这是另一种解决方案:
scala> def tTest[T, C[_]](it1: C[T], it2: Option[C[T]] = None)
| (implicit frac: math.Fractional[T], ev: C[T] => TraversableOnce[T]): TraversableOnce[T] = ev(it1)
tTest: [T, C[_]](it1: C[T], it2: Option[C[T]])(implicit frac: scala.math.Fractional[T], implicit ev: C[T] => scala.collection.TraversableOnce[T])scala.collection.TraversableOnce[T]
scala> tTest( Array(1.0,2,3,4), Option(Array(1.0,8,7)) )
res0: scala.collection.TraversableOnce[Double] = [D(1.0, 2.0, 3.0, 4.0)
scala> tTest( Array(1.0,2,3,4) )
res1: scala.collection.TraversableOnce[Double] = [D(1.0, 2.0, 3.0, 4.0)
编辑以上解决方案不适用于以下情况:
scala> tTest(Array(1.2), Option(List(2.0)))
<console>:9: error: inferred kinds of the type arguments (Double,Object) do not conform to the expected kinds of the type parameters (type T,type C).
Object's type parameters do not match type C's expected parameters:
class Object has no type parameters, but type C has one
tTest(Array(1.2), Option(List(2.0)))
^
<console>:9: error: type mismatch;
found : Array[Double]
required: C[T]
tTest(Array(1.2), Option(List(2.0)))
因此,这是一个更复杂,更灵活的方法:
scala> import math.Fractional
import math.Fractional
scala> import collection.{TraversableOnce => TO}
import collection.{TraversableOnce=>TO}
scala> def tTest2[T, C1[_], C2[_]](i1: C1[T], i2: Option[C2[T]])
| (implicit fc: Fractional[T],
| e1: C1[T] => TO[T],
| e2: C2[T] => TO[T]): TO[T] = e1(i1)
scala> tTest2(Array(1.2, 2.3), Option(List(2.3)))
res5: scala.collection.TraversableOnce[Double] = [D(1.2, 2.3)
scala> tTest2(Array(1.2, 2.3), Option(Array(2.3)))
res6: scala.collection.TraversableOnce[Double] = [D(1.2, 2.3)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句