6

任意のサイズの文字列のタプルを受け取り、各要素でトリムを呼び出して新しいタプルを返す関数を作成する必要があります。以下のこの時点で行き詰まっており、コードはすでにタイプセーフではありません。さらに、タプルを Iterator に変換すると、タプルに戻る方法がわかりません。この問題を解決するよりエレガントな方法はありますか? ソリューションは Scala 2.9.2 で動作する必要があります

  def trim(input:Product)={
    input.productIterator.asInstanceOf[Iterator[String]].map(_.trim)
  }
4

1 に答える 1

16

Shapelessを使用するソリューションを使用する場合、これは非常に簡単です (少なくとも Shapeless の用語では)。

import shapeless._

object trimmer extends (String -> String)(_.trim)

def trim[T <: Product, L <: HList](t: T)(implicit
  hlister: HListerAux[T, L],
  toList: ToList[L, String],
  mapper: MapperAux[trimmer.type, L, L],
  tupler: TuplerAux[L, T]
) = hlister(t).map(trimmer).tupled

その後:

scala> trim((" a ", "b ", " c"))
res0: (String, String, String) = (a,b,c)

scala> trim((" a ", "b ", " c", "d"))
res1: (String, String, String, String) = (a,b,c,d)

すべてが静的に適切に型付けされており、要素以外のタプルをフィードしようとすると、Stringコンパイル時にエラーが発生します。

すべてのボイラープレートを効果的にパッケージ化する Shapeless のようなライブラリがなければ、型の安全性を放棄するか、関心のあるすべてのタプル サイズ (最大 22 まで) の特別なケースを作成するかの 2 つのオプションに行き詰まります。

于 2013-05-09T22:34:06.950 に答える