在元组字段上应用偏函数,维护元组结构
applying partial function on a tuple field, maintaining the tuple structure
我有一个 PartialFunction[String,String]
和一个 Map[String,String]
。
我想在地图值上应用部分函数并收集它适用的条目。
即给定:
val m = Map( "a"->"1", "b"->"2" )
val pf : PartialFunction[String,String] = {
case "1" => "11"
}
我想以某种方式将 _._2
与 pf
结合起来并能够做到这一点:
val composedPf : PartialFunction[(String,String),(String,String)] = /*someMagicalOperator(_._2,pf)*/
val collected : Map[String,String] = m.collect( composedPf )
// collected should be Map( "a"->"11" )
到目前为止我得到的最好的是这个:
val composedPf = new PartialFunction[(String,String),(String,String)]{
override def isDefinedAt(x: (String, String)): Boolean = pf.isDefinedAt(x._2)
override def apply(v1: (String, String)): (String,String) = v1._1 -> pf(v1._2)
}
有没有更好的方法?
这是神奇的运算符:
val composedPf: PartialFunction[(String, String), (String, String)] =
{case (k, v) if pf.isDefinedAt(v) => (k, pf(v))}
不创建组合函数的另一种选择是:
m.filter(e => pf.isDefinedAt(e._2)).mapValues(pf)
Scalaz 中有一个函数,正是这样做的:second
scala> m collect pf.second
res0: scala.collection.immutable.Map[String,String] = Map(a -> 11)
这是可行的,因为 PartialFunction
是 Arrow(广义函数)类型类的实例,而 second
是为箭头定义的常见操作之一。
我有一个 PartialFunction[String,String]
和一个 Map[String,String]
。
我想在地图值上应用部分函数并收集它适用的条目。
即给定:
val m = Map( "a"->"1", "b"->"2" )
val pf : PartialFunction[String,String] = {
case "1" => "11"
}
我想以某种方式将 _._2
与 pf
结合起来并能够做到这一点:
val composedPf : PartialFunction[(String,String),(String,String)] = /*someMagicalOperator(_._2,pf)*/
val collected : Map[String,String] = m.collect( composedPf )
// collected should be Map( "a"->"11" )
到目前为止我得到的最好的是这个:
val composedPf = new PartialFunction[(String,String),(String,String)]{
override def isDefinedAt(x: (String, String)): Boolean = pf.isDefinedAt(x._2)
override def apply(v1: (String, String)): (String,String) = v1._1 -> pf(v1._2)
}
有没有更好的方法?
这是神奇的运算符:
val composedPf: PartialFunction[(String, String), (String, String)] =
{case (k, v) if pf.isDefinedAt(v) => (k, pf(v))}
不创建组合函数的另一种选择是:
m.filter(e => pf.isDefinedAt(e._2)).mapValues(pf)
Scalaz 中有一个函数,正是这样做的:second
scala> m collect pf.second
res0: scala.collection.immutable.Map[String,String] = Map(a -> 11)
这是可行的,因为 PartialFunction
是 Arrow(广义函数)类型类的实例,而 second
是为箭头定义的常见操作之一。