53 votes

Fonction partielle vide dans Scala

Il me semble que la syntaxe { case ... => ... } des fonctions partielles nécessite au moins un 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] = { }
                                                 ^
 

Alors, quel est le meilleur moyen de définir une fonction partielle "vide"? Existe-t-il un meilleur moyen que de remplacer "manuellement" isDefinedAt et apply ?

55voto

mpilquist Points 2410

La carte est une PartialFunction afin que vous puissiez faire:

 val undefined: PartialFunction[Any, Nothing] = Map.empty
 

42voto

Andrejs Points 4235

Depuis Scala 2.10, vous pouvez utiliser:

 val emptyPf = PartialFunction.empty[String, String]
 

8voto

missingfaktor Points 44003
 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
 

Comme @didierd l'a dit dans les commentaires, en raison des différences d'arguments, une seule instance peut couvrir tous les types d'arguments possibles.

 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
 

6voto

Didier Dupont Points 18256

Voler tout le monde, un mélange possible de tout cela:

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

5voto

Daniel C. Sobral Points 159554

Le plus court auquel je puisse penser:

 { case _ if false => "" }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X