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 つのオプションに行き詰まります。