我有一个 Scala 中各种类型的值列表——主要是字符串、整数、双精度值。其中一些值可能为空。我们可以认为这是一个List[Option[AnyRef]]
. 对于此列表中的每个值,如果存在,我想生成一个包含括号之间值的字符串;如果它不存在,则只是一个空字符串。此外,在值插入括号之间之前,可能需要对其应用转换。例如,如果值为 an Option[String]
,我可能想应用该trim
函数。
我通过将数据结构视为可选值的映射与对该值进行操作并返回字符串的可选函数配对来解决此问题(我不知道如何在 Scala 中指定它,因为我认为 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)",""]