2012-06-19 3 views
22

タプルをスライスして最後の2つのアイテムを削除しようとしています。私はリストのドロップ/メソッドを使用してみましたが、私はタプルを取得するために成功することはできません。ここでスカラでタプルをスライスする方法

は、私が試したのアプローチです:

scala> val myTuple = (1, 2, 4, 5, 0, 5) 
myTuple: (Int, Int, Int, Int, Int, Int) = (1,2,4,5,0,5) 

scala> val myList = myTuple.productIterator.toList 
myList: List[Any] = List(1, 2, 4, 5, 0, 5) 

scala> val mySubList = myList.dropRight(2) 
mySubList: List[Any] = List(1, 2, 4, 5) 

scala> val mySubTuple = ??? 

私はタプル、リストhereはScalaで可能ではない(まだ?)見ました。

サブタブを取得する他の方法はありますか(myTuple._1、myTuple._2 ...は扱いません)?

+4

これは[shapeless](https://github.com/milessabin/shapeless) 'HList'で行うことができると思います。 [この質問](http://stackoverflow.com/questions/9028459/a-clean-way-to-combine-two-tuples-into-a-new-larger-tuple-in-scala)を見てください。 – incrop

答えて

38

これはshapelessHListへの変換を含む、ジェネリックな方法で行うことができますものの一種です。

First - get shapeless。そして、依存方法の種類と実行Scalaは(2.10ではデフォルトでオン)オン:

C:\Scala\sdk\scala-2.9.2\bin>scala -Ydependent-method-types 
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_04). 
Type in expressions to have them evaluated. 
Type :help for more information. 

は、クラスパスに型崩れ追加:

scala> :cp C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar 
Added 'C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar'. Your new classpath is: 
"C:\tibco\tibrv\8.2\lib\tibrvnative.jar;C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar" 

は、今私たちがプレイしましょう!

scala> (1, 2.3, 'a, 'b', "c", true) 
res0: (Int, Double, Symbol, Char, java.lang.String, Boolean) = (1,2.3,'a,b,c,true) 

我々はHList

scala> res0.hlisted 
res2: shapeless.::[Int,shapeless.::[Double,shapeless.::[Symbol,shapeless.::[Char,shapeless.::[java.lang.String,shapeless.::[Boolean,shapeless.HNil]]]]]] = 1 :: 2.3 :: 'a :: b :: c :: true :: HNil 

に私達のタプルを回し型崩れ

scala> import shapeless._; import Tuples._; import Nat._ 
import shapeless._ 
import Tuples._ 
import Nat._ 

をインポートする必要がありますその後、我々は_4 typeパラメータであることに注意してください(最初の4ない取りますメソッド引数

scala> res2.take[_4] 
res4: shapeless.::[Int,shapeless.::[Double,shapeless.::[Symbol,shapeless.::[Char, shapeless.HNil]]]] = 1 :: 2.3 :: 'a :: b :: HNil 

今、私たちは、これを短縮することができ、バックタプル

scala> res4.tupled 
res5: (Int, Double, Symbol, Char) = (1,2.3,'a,b) 

への変換:もちろん

val (a, b, c, d) = sixtuple.hlisted.take[_4].tupled 
//a, b, c and d would all have the correct inferred type 

これは

+4

'-Ydependent-method-types'を必ず含めてください。' 'パラメータtuplerの暗黙の値を見つけることができませんでした:shapeless.Tupler [take 。アウト] '(私にしばらくの間、これに対する答えを出そうと混乱させた) –

+0

驚くべき答え、そして午後に!(フランス語のタイムゾーン:) – iwalktheline

+0

これはどのようにして変形がなくなった2.00で変わったのですか? – Edmondo1984

5
scala> val myTuple = (1, 2, 4, 5, 0, 5) 
myTuple: (Int, Int, Int, Int, Int, Int) = (1,2,4,5,0,5) 

scala> myTuple match { 
    | case (a, b, c, d, _, _) => (a, b, c, d) 
    | } 
res0: (Int, Int, Int, Int) = (1,2,4,5) 
+0

これは動作しますが、パターンマッチングを明示的に記述する必要があります。私はタプルの長さにかかわらず、それを行う方法を探しています。 – iwalktheline

+0

私の答えを見てください - 私はMiles Sabinの無形ライブラリを使って完全に働いている一般的な例を持っています –

3

方法についてのタプルNの最初のM要素に一般:

 

scala> val myTuple = (1,2,4,5,0,5) 
myTuple: (Int, Int, Int, Int, Int, Int) = (1,2,4,5,0,5) 

scala> val (left,right):Tuple2[List[Int],List[Int]] = myTuple.productIterator.toList.splitAt(myTuple.productArity - 2) 
left: List[Int] = List(1, 2, 4, 5) 
right: List[Int] = List(0, 5) 

scala> val mytuple2 = (right(0),right(1)) 
mytuple2: (Int, Int) = (0,5) 


+0

をコンパイルすることはできません:)タプルはProduct-sであり、イテレータとアリティがあることはわかりませんでした –

関連する問題