2016-04-22 5 views
3

私は匿名関数を格納したタプルを持っています。それらを反復して実行したいと思います。Scalaのタプルから関数を実行する

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)) 

を行うことができないのです。

答えて

1

productIteratorオンTuple返信Iterator[Any]で、Iterator[Function2[Int, Int, Int]]ではありません。

+0

このような状況で私はどのように対処しますか。パターンマッチングを行い、関数を実行する方法があります。 – bitan

4

タプルは反復処理されません。タプルの各エントリは異なる型になる可能性があるため、型システムはAny(つまりIterator[Any])と仮定しているため、型が失われます。つまり、反復したい場合は、SeqまたはSetのようなコレクションを使用することです。

あなたはタプルは、特定の種類の機能が含まれていることをを知って一方、あなたはasInstanceOfでキャスティングすることにより型チェックをバイパスすることができますが、型チェックはあなたの友人であるので、これはをお勧めしません。また

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

は、タプルとコレクションの両方の性質を持っているShapelessでHLists、見てください。

0

タイプ情報を保持しながらタプルの要素をSeqに抽出することができます。したがって、

Seq(functions._1, functions._2).map(_(1,2)) 
List(3, -1) 
関連する問題