加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)不会抛出异常,而仅仅是异常是函数设计的一部分(并且应该记录).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读