Double => Double
это просто сокращение для Function[Double, Double]
.PartialFunction
наследуется от Function
, но добавляет несколько методов.Что наиболее важно, он добавляет метод isDefinedAt
, который позволяет запрашивать, определена ли функция для какого-либо параметра.
case
без совпадения - это специальный синтаксис для определения частичных функций, который генерируетisDefinedAt
, который возвращает true
для всех соответствующих case
s.
Скажем, у нас есть функция, которая возвращает 1 / x, но только для положительных значений x, мы могли бы определить ее как:
scala> val f: (Double => Double) = { case x if x > 0 => 1/x }
f: (Double) => Double = <function1>
или как:
scala> val g: PartialFunction[Double, Double] = { case x if x > 0 => 1/x }
g: PartialFunction[Double,Double] = <function1>
Преимущество второй версии состоит в том, что мы можем проверить, применима ли функция к какому-либо параметру:
scala> g.isDefinedAt(-3)
res0: Boolean = false
Эта функция предназначена дляпример, используемый в Scala для реализации библиотеки актеров, где актер может использовать только определенные типы сообщений.