在Scala中提起部分功能有更好的方法吗?
-
12-10-2019 - |
题
我偶尔会遇到以下模式,从本质上讲我有一个 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的答案是正确的...
您的一部分是您试图 def
部分功能。所有这些都是创建一个返回一个的方法 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
不过是更好的解决方案,因为它允许推断器为您完成大部分工作,留下更干净的代码:)
不隶属于 StackOverflow