Пустая частичная функция в Scala - PullRequest
52 голосов
/ 25 августа 2011

Мне кажется, что синтаксис { 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] = { }
                                                 ^

Итак, каков наилучший способ определения «пустой» частичной функции?Есть ли лучший способ, чем ручное переопределение isDefinedAt и apply?

Ответы [ 7 ]

52 голосов
/ 26 августа 2011

Карта является PartialFunction, поэтому вы можете сделать:

val undefined: PartialFunction[Any, Nothing] = Map.empty
40 голосов
/ 31 августа 2013

Начиная с Scala 2.10, вы можете использовать:

val emptyPf = PartialFunction.empty[String, String]
8 голосов
/ 25 августа 2011
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
6 голосов
/ 25 августа 2011

Кража у каждого, возможное сочетание всего этого:

val undefined : PartialFunction[Any, Nothing] = {case _ if false =>
  sys.error("undefined")
}
5 голосов
/ 25 августа 2011

Самый короткий, который я могу себе представить:

{ case _ if false => "" }
4 голосов
/ 25 августа 2011

Решение (а это скорее взлом) состоит в том, чтобы гарантировать, что случай никогда не верен: { case x if x != x => sys.error("unexpected match") }

Простое любопытство, зачем вам такая функция?

3 голосов
/ 30 августа 2011

Может быть интересно узнать, что планируется добавить пустой элемент в библиотеку scala, и посмотреть, как это реализовано: https://github.com/scala/scala/commit/6043a4a7ed5de0be2ca48e2e65504f56965259dc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...