[英]Scala PartialFunctions from concrete ones
有什么快速方法可以用作PartialFunction[A, B]
的具体函数(类型为(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的合同不提供此类保证。
如果将隐式转换应用于未在所有地方定义的函数,则隐式转换将导致PartialFunction违反其约定。 而是使用皮条客使转换明确:
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)
不会引发异常,而只是该异常是函数设计的一部分(应记录在案)。
不,几个月前,我试图找到一个,最终写出了与您基本相同的我自己的书。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.