Тип частичной функции

#scala

#scala

Вопрос:

в scala play framework я видел этот код:

 abstract class AnalyserInfo
case class ColumnC(typeName:String,fieldName:String) extends AnalyserInfo
case class TableC(typeName:String) extends AnalyserInfo

    val asIs :PartialFunction[AnalyserInfo,String] = {
      case ColumnC(_,f) => f;
      case TableC(typeName) => typeName
    }
  

В чем разница с:

 val asIs: (AnaliserInfo)=>String = (info) => info match {
  case ColumnC(_,f) => f;
  case TableC(typeName) => typeName
}
  

Есть предпочтительный стиль? и почему в первом случае ключевое слово match может быть опущено?

Спасибо за поддержку.

Ответ №1:

Double => Double это просто сокращение от Function[Double, Double] . PartialFunction наследуется от Function , но добавляет несколько методов. Самое главное, он добавляет метод isDefinedAt , который позволяет вам запрашивать, определена ли функция для некоторого параметра.

case s без совпадения — это специальный синтаксис для определения частичных функций, который генерирует, isDefinedAt который возвращает true для всех совпадающих case функций.

Допустим, у нас есть функция, которая возвращает 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 для реализации библиотеки actor, где Actor может использовать только определенные типы сообщений.