从具体的部分函数



是否有任何快速的方法来使用作为一个具体的函数(类型,说,(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的契约保证你可以安全地在isDefinedAt返回true的地方调用apply。Function1的合同不提供这样的保证。

你的隐式转换将导致一个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)不会抛出异常,而仅仅意味着异常是函数设计的一部分(并且应该被记录)。

不,几个月前我试着找了一个,最后我写了一个和你的基本相同的。

相关内容

  • 没有找到相关文章

最新更新