5

タイプ A の値をペア (Seq[B]、Seq[C]) にマップする関数があります。この関数を A のシーケンスに適用し、平坦化された Seq[B] と Seq[C] のペアを返したいと考えています。コード スニペットは次のとおりです。

val a: Seq[A] 
val mapped: Seq[(Seq[B], Seq[C])] = a.map(f)

val (b, c) = mapped.unzip
val bc: (Seq[B], Seq[C]) = (b.flatten, c.flatten)

解決策は受け入れられますが、これを行うためのより慣用的な方法はありますか? for-comprehensions または flatMaps について考えましたが、それらをペアに適用する方法がわかりません。

4

3 に答える 3

3

shapeless 2.0.0-M1 availableであるため、タプルにマッピングできます。

import shapeless._, syntax.std.tuple._, poly._

val l = Seq(Seq(1, 2, 3, 4, 5) -> Seq('a, 'b, 'c), Seq(101, 102, 103) -> Seq('d, 'e, 'f))

type SS[T] = Seq[Seq[T]]
object flatten extends (SS ~> Seq) {
  def apply[T](ss: SS[T]) = ss.flatten
}

l.unzip.map(flatten) // l.unzip.hlisted.map(flatten).tupled for older versions of shapeless
// (Seq[Int], Seq[Symbol]) = (List(1, 2, 3, 4, 5, 101, 102, 103),List('a, 'b, 'c, 'd, 'e, 'f))

実際には、ポリモーフィック メソッドをポリモーフィック関数に自動的に変換できるはずですが、このコードは機能しません。

def flatten[T](s: Seq[Seq[T]]) = s.flatten
l.unzip.map(flatten _)
//<console>:31: error: type mismatch;
// found   : Seq[T]
// required: Seq[Seq[T]]
//              l.unzip.map(flatten _)
//                          ^
于 2013-09-18T14:08:16.133 に答える