2012-03-04 18 views
8

¿Es posible obtener el dominio de una función parcial en Scala?¿Cómo obtener el dominio de una función parcial en Scala?

Ex:

val f: PartialFunction[Int, Unit] = { 

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

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

    } 

¿Hay alguna manera de obtener algo como:

val list = f.getDomain 

lo que indicaría valores 1 y 2?

Actualización: Estoy tratando de crear un sistema de notificación (bus de eventos). El suscriptor tendrá este aspecto:

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) 

     } 

     } 

    } 

    } 

En mi NotiticationService (el distribuidor de eventos) Quiero tener acceso a los eventos declarados en el bloque cada notificaciones '' para que pueda empujar las notificaciones a los suscriptores. ¿Cómo puedo hacer eso?

Gracias de antemano.

+9

No veo cómo esto puede ser posible (en una cantidad razonable de cálculos, de todos modos. Considere una función parcial definida solo en números primos (para que getDomain necesite devolver todos los números primos) –

+0

Tiene un punto allí. Estaba pensando que el compilador de Scala podría ayudarme de alguna manera (en mi ejemplo debería ser fácil recuperar el dominio) .Gracias. – d4rkang3l

+1

Si desea tener acceso al dominio, utilice un 'Map' en su lugar. – ziggystar

Respuesta

11

Si usted tiene una colección, y que le gustaría saber qué elementos pertenecen también al ámbito de la f, puede utilizar filter y isDefinedAt así:

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

Esto simplemente comprueba exhaustivamente. No sé si hay alguna mejor manera.

+0

Estaba pensando en eso, pero pensé que quizás había otra manera. – d4rkang3l

4

Es intrínsecamente imposible, ya que se puede definir una función parcial para cualquier subconjunto del rango de entrada; el rango de entrada en sí mismo puede no ser finito, en cuyo caso el dominio tampoco necesariamente será finito. Solo puede obtener el dominio mediante una concordancia exhaustiva (según la respuesta de Dan), sin embargo, no puede buscar exhaustivamente un espacio de entrada infinito.

+0

Creo que sería útil tener la opción de encontrar los valores de dominio 'fijos' (por ejemplo, me refiero a casos simples en valores simples). O tal vez para recuperar algún tipo de rangos de dominio. – d4rkang3l

+1

Esto requeriría algunos hacks muy feos en el código del compilador e imposible de hacer en el caso general de todos modos. A nivel personal, no creo que esto sea útil más allá de un puñado de casos especiales; hay formas más limpias de hacerlo (como registrar todos los valores 'fijos' admitidos en un mapa, por cada comentario de ziggystar). –

Cuestiones relacionadas