如何在Scala中获得部分函数的域?

如何在Scala中获得部分函数的域?,scala,functional-programming,Scala,Functional Programming,可以在Scala中获得部分函数的域吗 例: 有没有什么办法可以得到这样的东西: val list = f.getDomain 哪个表示值1和2 更新:我正在尝试构建一个通知系统(事件总线)。 订阅服务器将如下所示: class SomeSubscriber extends Subscriber { notifications { case LoginEvent(date) => println("Login on " + date)

可以在Scala中获得部分函数的域吗

例:

有没有什么办法可以得到这样的东西:

    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(事件调度器)中,我希望访问每个“通知”块中声明的事件,以便将通知推送到订阅者。我该怎么做


提前感谢。

如果您有一个集合,并且您想知道哪些元素也属于
f
的域,您可以使用
过滤器
定义如下:

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

这只是彻底检查。我不知道是否有更好的方法。

这本来是不可能的,因为可以为输入范围的任何子集定义部分函数;输入范围本身可能不是有限的,在这种情况下,域也不一定是有限的。您只能通过穷举匹配(根据Dan的回答)获得域,但是您无法穷举搜索无限的输入空间。

对于六年的延迟,非常抱歉

我不相信用地图就能解决这个问题。通知的格式如下:

case LoginEvent(date) => ...
它涉及一个包含变量date的模式,该变量的值在编译时未知:当模式在执行期间匹配时,它将被绑定

实际上,您不需要域值的列表(或集合)。你想知道我看到的模式


我也遇到过这个问题,虽然这可能不是一个常见的问题,但我同意,它确实深入到了Scala中反射的角色:从程序内部检查代码的能力。它涉及浅内部DSL和深内部DSL之间的区别。上面的DSL是浅的,这导致了无法分析代码的问题。

我看不出这是怎么可能的(在合理的计算量中)。考虑仅在素数上定义的部分函数(因此GETEngy需要返回所有素数)。你说得有道理。我一直在想Scala编译器会以某种方式帮助我(在我的示例中,检索域应该很容易)。谢谢。如果您想访问域,那么请使用
映射
。假设您有一个
部分函数
,该函数在某个范围内的
Double
s上工作。您希望以什么形式返回域?对于Double的I wo范围,当然不是定义它的所有可能的
Double
值的列表uld方面类似于列表[Range](带有Range.getMin、Range.getMax)。我认为对于内联声明的部分函数,您可以在编译时找到域。在我的情况下,这将对我有很大帮助。我正考虑这样做,但我认为可能还有另一种方法。我认为有一个选项可以找到“固定”域值(固定是指简单值的大小写)。或者检索某种域范围。这需要对编译器代码进行一些非常丑陋的黑客攻击,在一般情况下是不可能做到的。就个人而言,我觉得这在少数特殊情况下是没有用的;有更干净的方法可以做到这一点(例如,根据ziggystar上面的评论,在地图中注册所有支持的“固定”值)。
case LoginEvent(date) => ...