Как объявить новый частичный тип функции в Scala - PullRequest
3 голосов
/ 02 марта 2012

Следующее действительно для моего понимания языка.

Как я могу объявить новый, специфический частичный тип функции.Допустим, мне нужно объявить много частично определенных функций, взять класс MyClass и вернуть строку.Если я попытаюсь:

class mypf extends PartialFunction[MyClass, String]
val myinstance: mypf = { case ... }

Scala жалуется, что mypf должен быть абстрактным.Как бы я это сделал?Это плохая идея, чтобы сделать это вообще?Если так, то почему?

Ответы [ 3 ]

8 голосов
/ 02 марта 2012

Хотя это не решает вашу проблему в целом, это может помочь в данном конкретном случае:

scala> type mypf = PartialFunction[Int, String]
defined type alias mypf

// type alias for PartialFunction

scala> val x: mypf = {case x: Int if x > 10 => "More than ten"}
x: mypf = <function1>
6 голосов
/ 02 марта 2012

Если вам нужно просто иметь псевдоним для PartialFuncion [MyClass, String], вы должны сделать

type MyPf = PartialFunction[MyClass, String]

это объявление невозможно на верхнем уровне, оно должно быть внутри объекта.Если вы хотите, чтобы он выглядел очень похоже на объявление верхнего уровня, то вы можете объявить тип в объекте пакета.

Чтобы пойти немного дальше, выполните команду

abstract class mypf extends PartialFunction[MyClass, String] 

юридический (он явно должен быть абстрактным, в нем отсутствует реализация для применения и он определен).Однако выражение типа {case x => ...} будет иметь тип PartialFunction, а не ваш тип, поэтому ваш тип не будет удобным.

Даже без потери литералов использование наследования только для получения псевдонима имеет ограниченное применение.Если вы сделаете class MyClass extends Something<With, Lots, Of, Parameters>, MyClass поможет при создании экземпляров, но объявление параметров метода типа MyClass предотвращает чрезмерное ограничение метода.

2 голосов
/ 02 марта 2012

A PartialFunction не нужно определять для всей входной области, поэтому черта определяет как apply, так и isDefinedAt как абстрактные.Таким образом, вы должны реализовать описанные выше методы следующим образом:

val myInstance = new PartialFunction[Int, String] {
  override def apply(i: Int): String = {
    if (i < 100)
      "Valid " + i
    else
      "Undefined"
  }

  override def isDefinedAt(i: Int): Boolean = i < 100
}

Вам не нужно явно говорить override, но иногда это полезно.

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