Scala中的空部分函数

aio*_*obe 53 scala partialfunction

在我看来{ case ... => ... },部分函数的语法至少需要一个case:

scala> val pf: PartialFunction[String, String] = { case "a" => "b" } 
pf: PartialFunction[String,String] = <function1>

scala> val pf: PartialFunction[String, String] = { }                
<console>:5: error: type mismatch;
 found   : Unit
 required: PartialFunction[String,String]
       val pf: PartialFunction[String, String] = { }
                                                 ^
Run Code Online (Sandbox Code Playgroud)

那么,定义"空"部分函数的最佳方法是什么?难道还有比"手动"覆盖更好的办法isDefinedAtapply

mpi*_*ist 55

Map是PartialFunction,所以你可以这样做:

val undefined: PartialFunction[Any, Nothing] = Map.empty
Run Code Online (Sandbox Code Playgroud)

  • 从2.10开始,`PartialFunction.empty`可用 (33认同)
  • 实际上还有大量未充分记录的`FSM.NullFunction`(它做同样的事情).我现在正在添加文档. (3认同)

And*_*ejs 42

从Scala 2.10开始,您可以使用:

val emptyPf = PartialFunction.empty[String, String]
Run Code Online (Sandbox Code Playgroud)


mis*_*tor 8

scala> def pfEmpty[A, B] = new PartialFunction[A, B] {
     |   def apply(a: A): B = sys.error("Not supported")
     |   def isDefinedAt(a: A) = false
     | }
pfEmpty: [A, B]=> java.lang.Object with PartialFunction[A,B]

scala> val f = pfEmpty[String, String]
f: java.lang.Object with PartialFunction[String,String] = <function1>

scala> f.lift
res26: (String) => Option[String] = <function1>

scala> res26("Hola")
res27: Option[String] = None
Run Code Online (Sandbox Code Playgroud)

正如@didierd在评论中所说,由于参数差异,单个实例可以涵盖所有可能的参数类型.

scala> object Undefined extends PartialFunction[Any, Nothing] {
     |   def isDefinedAt(a: Any) = false
     |   def apply(a: Any): Nothing = sys.error("undefined")
     | }
defined module Undefined

scala> val f: PartialFunction[String, String] = Undefined
f: PartialFunction[String,String] = <function1>

scala> f.lift apply "Hola"
res29: Option[String] = None
Run Code Online (Sandbox Code Playgroud)

  • 给定参数差异,单个实例可以完成所有操作:object Undefined [Any,Nothing] {... your impl ...} (3认同)
  • @Nicolas:是的,定义一个为你做的功能.(`pfEmpty` here);) (2认同)
  • 不应该应用引发scala.MatchError异常?这就是应用未定义输入的PF通常会做的事情. (2认同)

Did*_*ont 6

从每个人那里窃取,可能的混合:

val undefined : PartialFunction[Any, Nothing] = {case _ if false =>
  sys.error("undefined")
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 5

我能想到的最短的一个:

{ case _ if false => "" }
Run Code Online (Sandbox Code Playgroud)