有没有更好的方法在Scala中提升PartialFunction?

我偶尔会遇到以下模式,我基本上有一个
PartialFunction[SomeType,AnotherType]
,并希望将其视为
Function[SomeType,Option[AnotherType]
,例如:
def f(s:SomeType):Option[AnotherType] = s match {
  case s1:SubType1 => Some(AnotherType(s1.whatever))
  case s2:SubType2 => Some(AnotherType(s2.whatever))
  case _ => None
}
有没有办法以避免默认情况并将结果包装在
Some
中的方式编写上述函数?到目前为止我提出的最好的是:
def f(s:SomeType):Option[AnotherType] = pf.lift(s)
def pf:PartialFunction[SomeType,AnotherType] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}
有没有办法在没有定义中间函数的情况下做到这一点?我已经尝试了以下几行,但还没有任何东西可以编译:
def f:Function[SomeType,Option[AnotherType]] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}.lift
    
已邀请:
condOpt
在对象scala.PartialFunction中。来自scaladoc:
def onlyInt(v: Any): Option[Int] = condOpt(v) { case x: Int => x }
    
不是一个答案,作为解释为什么huynhjl的答案是正确的... 你混淆的部分原因是你试图partial8ѭ部分功能。所有这一切都是为了创建一个返回
PartialFunction
对象的方法,当你也可以直接创建它时:
val pf: PartialFunction[SomeType,AnotherType] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}
虽然我个人更喜欢使用类型归属:
val pf = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
} : PartialFunction[SomeType,AnotherType]
无论哪种方式,你必须指定输入类型是什么,所以你必须给出
PartialFunction
的确切签名。我知道感觉应该可以推断出来,但是,唉,可悲的是并非如此! 使用归属版本,您可以在同一个地方定义和提升所有内容:
val pf = ({
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
} : PartialFunction[SomeType,AnotherType]).lift
PartialFunction.condOpt
是更好的解决方案,因为它允许推理器为你完成大部分工作,留下更清晰的代码:)     

要回复问题请先登录注册