在Scala中执行Tuple中的函数

时间:2016-04-22 03:58:40

标签: scala function lambda functional-programming tuples

我有一个Tuple,我存储了匿名函数,我想迭代它们并执行它们。

val functions = ((x:Int, y:Int) => x + y, (x:Int, y: Int) => x - y)
// I want to execute the anonymous functions in the Tuple
functions.productIterator.foreach(function => function)

不幸的是我无法做到

functions.productIterator.foreach(function => function(1, 2))

OR

functions.productIterator.foreach(_(1, 2))

出路是什么?

3 个答案:

答案 0 :(得分:4)

元组并不意味着迭代。类型会丢失,因为元组中的每个条目都可以是不同的类型,因此类型系统只假定Any(因此Iterator[Any])。所以真正的建议是,如果你想迭代,请使用像SeqSet这样的集合。

另一方面,如果您知道元组包含特定类型的函数,那么您可以通过使用asInstanceOf进行转换来绕过类型检查,但这是不推荐因为类型检查是你的朋友。

functions.productIterator.map(_.asInstanceOf[(Int,Int)=>Int](1, 2))
// produces `Iterator(3, -1)`

或者,查看Shapeless中的HLists,它们具有元组和集合的属性。

答案 1 :(得分:1)

productIterator上的

Tuple会返回Iterator[Any],而不是Iterator[Function2[Int, Int, Int]],正如您所期望的那样。

答案 2 :(得分:0)

我们可以在保留类型信息的同时将元组的元素提取为Seq;因此

Seq(functions._1, functions._2).map(_(1,2))
List(3, -1)