54

{ case ... => ... }部分関数の構文には少なくとも1つ必要なようです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] = { }
                                                 ^

では、「空の」部分関数を定義する最良の方法は何でしょうか。「手動で」オーバーライドするよりも良い方法はありますisDefinedAtapply

4

7 に答える 7

59

Map は PartialFunction であるため、次のことができます。

val undefined: PartialFunction[Any, Nothing] = Map.empty
于 2011-08-26T03:03:15.403 に答える
50

Scala 2.10 以降、以下を使用できます。

val emptyPf = PartialFunction.empty[String, String]
于 2013-08-31T08:51:43.487 に答える
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

@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
于 2011-08-25T10:50:13.383 に答える
6

すべての人から盗み、すべての可能性のある組み合わせ:

val undefined : PartialFunction[Any, Nothing] = {case _ if false =>
  sys.error("undefined")
}
于 2011-08-25T14:01:44.480 に答える
5

私が考えることができる最短のもの:

{ case _ if false => "" }
于 2011-08-25T12:03:59.733 に答える
4

解決策(よりハックです)は、ケースが決して真にならないようにすることです:{ case x if x != x => sys.error("unexpected match") }

単純な好奇心、なぜそのような機能が必要なのですか?

于 2011-08-25T10:54:34.383 に答える
3

scala ライブラリに空のメンバーを追加する計画があることを知り、それがどのように実装されているかを確認することは興味深いかもしれません: https://github.com/scala/scala/commit/6043a4a7ed5de0be2ca48e2e65504f56965259dc

于 2011-08-30T09:45:10.303 に答える