在Scala中链接和部分功能
发布时间:2020-12-16 21:34:21 所属栏目:安全 来源:网络整理
导读:让我们重复从每日 scala的例子: type PF = PartialFunction[Int,Int]val pf1 : PF = {case 1 = 2} val pf2 : PF = {case 2 = 3} 让我们补充一点: val pf3 : PF = {case 3 = 4} 然后在这里工作: pf1 andThen pf2 isDefinedAt(x) 返回true iff x == 1(实际
让我们重复从每日
scala的例子:
type PF = PartialFunction[Int,Int] val pf1 : PF = {case 1 => 2} val pf2 : PF = {case 2 => 3} 让我们补充一点: val pf3 : PF = {case 3 => 4} 然后在这里工作: pf1 andThen pf2 isDefinedAt(x) 返回true iff x == 1(实际上,pf2根本不需要是PartialFunction) 但是,我预计: pf1 andThen pf3 isDefinedAt(x) 将为所有x返回false(即,iff pf1被定义,检查pf3),但它不仅仅验证pf1. 最后,pf1和tf pf3 lift(x)总是导致MatchError.我希望得到无…我可以通过解除pf1.lift(x).flatMap(pf3.lift)中的每个函数来获取这个行为,但是有没有更简单的方法使用纯PartialFunction API? (并且不分别提升每个部分功能) 解决方法
如果你看看,然后:
def andThen[C](k: (B) => C): PartialFunction[A,C] 这组成了具有功能而不是部分功能的接收机.也就是说,k预计将被完全定义,它没有isDefinedAt.因此,所得到的部分函数不需要改变isDefinedAt的行为,它仍然只需要参考第一个部分函数. 您可以编写自己的扩展名,其中包含两个部分功能: implicit class ComposePartial[A,B](pf: PartialFunction[A,B]) { def collect[C](that: PartialFunction[B,C]): PartialFunction[A,C] = new PartialFunction[A,C] { def apply(a: A): C = that(pf(a)) def isDefinedAt(a: A) = pf.isDefinedAt(a) && { val b = pf(a) that.isDefinedAt(b) } } } pf1 collect pf2 isDefinedAt(1) // true pf1 collect pf3 isDefinedAt(1) // false 问题是您必须调用pf(a),所以考虑到Scala不执行纯度,您可能会不必要地执行副作用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |