2012-03-04 48 views
8

Có thể lấy miền của một chức năng một phần trong Scala không?Làm thế nào để có được tên miền của một chức năng một phần trong Scala?

Ex:

val f: PartialFunction[Int, Unit] = { 

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

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

    } 

Có cách nào để có được một cái gì đó như:

val list = f.getDomain 

đó sẽ chỉ ra các giá trị 1 và 2?

Cập nhật: Tôi đang cố gắng xây dựng hệ thống thông báo (xe buýt sự kiện). Các thuê bao sẽ trông như thế này:

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) 

     } 

     } 

    } 

    } 

Trong NotiticationService tôi (dispatcher sự kiện) Tôi muốn truy cập các sự kiện khai báo trong khối mỗi 'thông báo' vì vậy tôi có thể đẩy các thông báo tới các thuê bao. Làm thế nào tôi có thể làm điều đó?

Xin cảm ơn trước.

+9

Tôi không thể thấy điều này có thể xảy ra như thế nào (trong một số lượng hợp lý của tính toán.) Hãy xem xét một hàm được xác định chỉ trên số nguyên tố (vì vậy getDomain sẽ cần trả về tất cả các số nguyên tố) –

+0

Bạn có một điểm ở đó. Tôi đã nghĩ rằng trình biên dịch Scala sẽ có thể giúp tôi bằng cách nào đó (trong ví dụ của tôi nên dễ dàng lấy lại tên miền) .Thanks: – d4rkang3l

+1

Nếu bạn muốn truy cập vào miền, sau đó sử dụng một 'Bản đồ' thay thế. – ziggystar

Trả lời

11

Nếu bạn có một bộ sưu tập, và bạn muốn biết yếu tố nào cũng thuộc về lĩnh vực f, bạn có thể sử dụng filterisDefinedAt như vậy:

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

này chỉ đơn giản là kiểm tra thấu đáo. Tôi không biết có cách nào tốt hơn không.

+0

Tôi đã nghĩ đến điều đó, nhưng tôi có thể có một cách khác. – d4rkang3l

4

Nó vốn dĩ là không thể, vì một phần chức năng có thể được xác định cho bất kỳ tập con của phạm vi đầu vào; phạm vi đầu vào chính nó có thể không hữu hạn, trong trường hợp đó, miền sẽ không nhất thiết là hữu hạn. Bạn chỉ có thể có được tên miền thông qua một trận đấu đầy đủ (theo câu trả lời của Dan), tuy nhiên bạn không thể tìm kiếm một cách toàn diện một không gian đầu vào vô hạn.

+0

Tôi nghĩ rằng sẽ hữu ích khi có tùy chọn tìm các giá trị tên miền 'cố định' (theo trường hợp cố định của tôi trên các giá trị đơn giản). Hoặc có thể truy xuất một số phạm vi tên miền. – d4rkang3l

+1

Điều này sẽ yêu cầu một số hacks rất xấu xí trong mã trình biên dịch và không thể làm trong trường hợp chung anyway. Ở cấp độ cá nhân tôi không cảm thấy điều này sẽ hữu ích ngoài một số trường hợp đặc biệt; có những cách sạch hơn để thực hiện việc này (chẳng hạn như đăng ký tất cả các giá trị 'cố định' được hỗ trợ trong bản đồ, theo nhận xét của ziggystar ở trên). –

Các vấn đề liên quan