主に文字列、int、double など、さまざまなタイプの Scala の値のリストがあります。これらの値の一部は null の場合があります。これは と考えることができますList[Option[AnyRef]]
。このリストの各値について、存在する場合は、括弧内の値を含む文字列を生成したいと考えています。存在しない場合は、空の文字列になります。さらに、値を括弧の間に挿入する前に、変換を適用する必要がある場合があります。たとえば、値が の場合Option[String]
、関数を適用したいと思うかもしれませんtrim
。
私は、データ構造をオプションの値のマップと考え、その値を操作して文字列を返すオプションの関数と考えることで、これに取り組みました (私は Map[Option [A], Option[(A) => String]] は正しくありません。すべてのオプション キーが同じ型であることを意味します)。これまでにサンプルデータと関数を使用して書いたものは次のとおりです。
lazy val messageContext = Map(
None -> None,
Some("hello") -> None,
Some(4) -> Some(negate _),
None -> None
) map { t => wrapText(t._1, t._2) } toList
private def wrapText[A](option: Option[A], transFn: Option[(A) => String]): String = option match {
case Some(o) => " (%s)".format(transFn.getOrElse(stringIdentity _)(o))
case _ => ""
}
private def stringIdentity[A](a: A) = a.toString
private def negate(n: Number) = n * -1
ただし、コンパイラ エラーが発生します。
error: type mismatch;
found : Option[java.lang.Number => java.lang.String]
required: Option[AnyVal{def getClass(): java.lang.Class[_ >: Double with Int <: AnyVal]} => String]
) map { t => wrapText(t._1, t._2) } toList
私のアプローチはこれに近いですか?これは Scala で簡単に実現できますか? それとも、これを実際に機能させるには、いくつかの scalaz マジックに頼る必要がありますか?
ありがとう。
編集:上記の入力の正しい出力は次のようになります。
List[""," (hello)"," (-4)",""]