在Scala中编写TraversableOnce的泛型函数?

约书亚

我具有以下形式的功能:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Scala中编写TraversableOnce的泛型函数?

来自分类Dev

Scala中泛型函数的奇怪问题

来自分类Dev

如何在C#中编写泛型函数?

来自分类Dev

Scala泛型函数调用

来自分类Dev

Rust中的泛型函数

来自分类Dev

Swift 中的泛型函数

来自分类Dev

在Swift中从非泛型函数调用泛型函数

来自分类Dev

在Swift中从非泛型函数调用泛型函数

来自分类Dev

如何在scala中实现一个泛型函数,该泛型函数可以添加和求和参数?

来自分类Dev

Scala:如何在具有算术元素的可排序集合上编写泛型函数

来自分类Dev

Scala泛型函数假设类型

来自分类Dev

在Rust中编写一个将可迭代容器作为参数的泛型函数

来自分类Dev

如何使用协议关联类型在Swift中编写泛型函数

来自分类Dev

迅捷:如何编写调用专门函数的泛型函数

来自分类Dev

从泛型函数中的枚举获取rawValue

来自分类Dev

如何编写枚举类型的Swift泛型函数?

来自分类Dev

返回类型取决于Scala中输入类型的泛型函数?

来自分类Dev

Scala:将多个函数转换为单个泛型函数?

来自分类Dev

Scala泛型函数...在函数中使用T

来自分类Dev

静态非泛型类中的泛型函数?

来自分类Dev

泛型函数重载

来自分类Dev

Delphi泛型函数

来自分类Dev

泛型函数?

来自分类Dev

Kotlin泛型函数

来自分类Dev

Delphi泛型函数

来自分类Dev

迅速,在另一个泛型函数中调用泛型函数

来自分类Dev

Scala:具有嵌套案例类的泛型函数

来自分类Dev

Scala在子类化的泛型函数中提供类型信息

来自分类Dev

在没有泛型的情况下编写泛型函数