2012-03-04 2 views
8

Scala에서 부분 함수의 도메인을 가져올 수 있습니까?스칼라에서 부분 함수의 도메인을 가져 오는 방법은 무엇입니까?

예 : 값 1과 2를 나타냅니다

val list = f.getDomain 

:

val f: PartialFunction[Int, Unit] = { 

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

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

    } 

같은 것을 얻을 방법이 있나요?

업데이트 : 알림 시스템 (이벤트 버스)을 구축하려고합니다. 가입자는 다음과 같이 표시됩니다 내 NotiticationService에서

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) 

     } 

     } 

    } 

    } 

(이벤트 디스패처를) 내가 가입자에 푸시 알림을 할 수 있도록 모든 '통지'블록에 선언 된 이벤트에 액세스하려고합니다. 어떻게해야합니까?

미리 감사드립니다. 당신이 컬렉션을 가지고, 당신은 또한 f의 영역에 속하는 요소를 알고 싶은 경우

+9

어쨌든 합리적인 계산량에서 소수가 정의 된 부분 함수를 고려하십시오 (getDomain은 모든 소수를 반환해야합니다) –

+0

거기에 포인트가 있습니다. 나는 스칼라 컴파일러가 어떻게 든 도와 줄 수있을 것이라고 생각했다. (예제에서 도메인을 쉽게 검색 할 수 있어야한다.) 감사합니다. – d4rkang3l

+1

도메인에 액세스하려면 대신'Map'을 사용하십시오. – ziggystar

답변

11

, 당신과 같이 filterisDefinedAt를 사용할 수 있습니다

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

이것은 단순히 철저하게 검사합니다. 더 좋은 방법이 있는지 나는 모른다.

+0

나는 그것에 대해 생각하고 있었지만 다른 길은 있을지도 모른다. – d4rkang3l

4

부분적 기능이 입력 범위의 하위 집합에 대해 정의 될 수 있기 때문에 본질적으로 불가능합니다. 입력 범위 자체가 유한하지 않을 수도 있습니다.이 경우 도메인이 반드시 유한 할 필요는 없습니다. 철저한 일치 (단답에 따라)를 통해서만 도메인을 얻을 수 있지만 무한한 입력 공간을 철저히 검색 할 수는 없습니다.

+0

나는 '고정 된'도메인 값을 찾는 옵션을 사용하는 것이 유용 할 것이라고 생각합니다. 고정 된 값은 간단한 값을 뜻합니다. 또는 도메인의 일종의 범위를 검색 할 수 있습니다. – d4rkang3l

+1

이것은 컴파일러 코드에서 매우 추악한 해킹이 필요하고 어쨌든 일반적인 경우에는 불가능합니다. 개인적인 차원에서 나는 소수의 특별한 경우를 넘어서 유용 할 것이라고 생각하지 않는다. (위의 ziggystar의 설명에 따라지도에 지원되는 '고정'값을 모두 등록하는 등) 더 깨끗한 방법이 있습니다. –

관련 문제