Как получить домен частичной функции в Scala? - PullRequest
8 голосов
/ 05 марта 2012

Возможно ли получить домен частичной функции в Scala?

Пример:

    val f: PartialFunction[Int, Unit] = {

      case 1 => println("This is 1")

      case 2 => println("This is 2")

   }

Есть ли способ получить что-то вроде:

    val list = f.getDomain

, который будет указывать значения 1 и 2?

Обновление : Я пытаюсь создать систему уведомлений (шина событий).Подписчик будет выглядеть следующим образом:

    class SomeSubscriber extends Subscriber {

    notifications {

      case LoginEvent(date) => println("Login on " + date)

      case LogoutEvent(date) => println("Logout on " + date)

      case e: Notification[Any] => async {

         println("Other notification: " + e)

         ui {

          println("UI in async! " + e)

         }

       }

     }

   }

В моем NotiticationService (диспетчере событий) я хочу получить доступ к событиям, объявленным в каждом блоке «уведомлений», чтобы я мог отправлять уведомления подписчикам.Как я могу это сделать?

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 05 марта 2012

Если у вас есть коллекция, и вы хотите знать, какие элементы также принадлежат домену f, вы можете использовать filter и isDefinedAt, например, так:

scala> 1 to 10 filter f.isDefinedAt
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2)

Это просто проверяет исчерпывающе.Я не знаю, есть ли лучший способ.

4 голосов
/ 05 марта 2012

Это по своей сути невозможно, так как частичная функция может быть определена для любого подмножества входного диапазона;сам входной диапазон не может быть конечным, и в этом случае область не обязательно будет конечной.Вы можете получить домен только через исчерпывающее совпадение (согласно ответу Дэна), однако вы не можете исчерпывающе искать бесконечное пространство ввода.

0 голосов
/ 22 марта 2018

Извините за шестилетнюю задержку.

Я не верю, что эту проблему можно решить с помощью карты. Уведомления имеют вид:

case LoginEvent(date) => ...

, который включает в себя шаблон, который содержит переменную дату, значение которой неизвестно во время компиляции: он будет связан, если шаблон соответствует во время выполнения.

Вы на самом деле не хотите список (или набор) значений домена. Вы хотите знать шаблон, как я его вижу.

Я также сталкивался с этой проблемой, и, хотя она, возможно, не является распространенной проблемой, согласился, она действительно погружается в роль отражения в Scala: способность проверять код изнутри программы. Это касается различия между мелкими и глубокими внутренними DSL. Приведенный выше DSL неглубокий, что приводит к невозможности анализа кода.

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