繁体   English   中英

来自具体功能的Scala PartialFunction

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM