2012-03-04 66 views
8

是否有可能在Scala中獲得部分函數的域?如何在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(事件調度),我要訪問每一個「通知」塊中聲明,所以我可以推通知給用戶的事件。我怎樣才能做到這一點?

在此先感謝。

+9

我看不出這是怎麼回事(無論如何都是合理的計算量)考慮一個只在素數上定義的部分函數(所以getDomain需要返回所有素數) – 2012-03-04 21:49:57

+0

你在那裏得到了一個點。我以爲Scala編譯器能夠以某種方式幫助我(在我的示例中應該很容易檢索域)。謝謝 – d4rkang3l 2012-03-05 06:43:14

+1

如果您想訪問域,請使用「Map」代替 – ziggystar 2012-03-05 09:35:07

回答

11

如果你有一個集合,你想知道哪些元素也屬於f域,你可以使用filterisDefinedAt像這樣:

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

這只是檢查詳盡。我不知道有沒有更好的辦法。

+0

我在想,但我也許有另一種方式。 – d4rkang3l 2012-03-05 06:34:39

4

這本質上是不可能的,因爲可以爲輸入範圍的任何子集定義部分函數;輸入範圍本身可能不是有限的,在這種情況下,域也不一定是有限的。您只能通過詳盡的匹配獲得域名(根據Dan的答案),但是您無法詳盡搜索無限輸入空間。

+0

我認爲找到'固定'域值(通過修正我的意思是簡單值的情況)是有用的。或者也許檢索某種範圍的域。 – d4rkang3l 2012-03-05 11:42:26

+1

這將需要編譯器代碼中的一些非常難看的黑客攻擊,無論如何不可能在一般情況下進行。在個人層面上,我認爲除了一些特殊情況之外,這不會有用;有更乾淨的方法來做到這一點(比如在地圖上註冊所有支持的「固定」值,按照上面的ziggystar的評論)。 – 2012-03-05 12:41:09

相關問題