Scala PartialFunctions来自具体的
发布时间:2020-12-16 18:15:15 所属栏目:安全 来源:网络整理
导读:有没有什么快速的方法可以用作具体函数(类型,比方说,(A)= B)作为PartialFunction [A,B]?我所知道的最简洁的语法是: (a: A) = a match { case obj = func(obj) } 在任何地方都有隐式转换,例如: implicit def funcAsPartial[A,B](func: A = B) = new Partia
有没有什么快速的方法可以用作具体函数(类型,比方说,(A)=> B)作为PartialFunction [A,B]?我所知道的最简洁的语法是:
(a: A) => a match { case obj => func(obj) } 在任何地方都有隐式转换,例如: implicit def funcAsPartial[A,B](func: A => B) = new PartialFunction[A,B] { def isDefinedAt(a: A) = true def apply(a: A) = func(a) } 我想我刚刚写了我要找的东西,但这已经存在于Scala库中吗? 解决方法
使用隐式转换执行此操作很危险,原因与(A)=>相同. B不应该继承PartialFunction [A,B].也就是说,PartialFunction的合同保证您可以安全地*调用apply,无论isDefinedAt返回true. Function1的合同不提供此类保证.
如果将PartidFunction应用于未定义的函数,则隐式转换将导致违反其合同的PartialFunction.相反,使用pimp使转换显式: implicit def funcAsPartial[A,B](f: A => B) = new { /** only use if `f` is defined everywhere */ def asPartial(): PartialFunction[A,B] = { case a => f(a) } def asPartial(isDefinedAt: A => Boolean): PartialFunction[A,B] = { case a if isDefinedAt(a) => f(a) } } // now you can write val f = (i: Int) => i * i val p = f.asPartial // defined on all integers val p2 = f.asPartial(_ > 0) // defined only on positive integers *正如评论中所讨论的,可能并不完全清楚“安全”在这里意味着什么.我想到的方式是PartialFunction在以下精确意义上显式声明其域:如果isDefinedAt为值x返回true,则可以以与函数作者的意图一致的方式计算apply(x) .这并不意味着apply(x)不会抛出异常,而仅仅是异常是函数设计的一部分(并且应该记录). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |