문제

우리가있는 한 PartialFunction[X,R] 반환하는 함수로 변환하는 것은 매우 쉽습니다. Option[R], 예를 들어

def pfToOptf[X, R](f: PartialFunction[X,R])(x: X) =
    if (f.isDefinedAt(x)) Some(f(x))
    else None

그러나 작업이 반대라면 어떨까요? f 구하는 X 논쟁과 귀환으로 Option[R] 결과적으로. 그리고 나는 만들고 싶다 PartialFunction[X,R] 그것에서. 가장 좋은 방법은 무엇입니까?

내가 생각해 낸 것은 내 취향에 꽤 못 생겼다 :

def optfToPf[X,R](f: X => Option[R]) : PartialFunction[X,R] = {
    object extractor {
        def unapply(x: X): Option[R] = f(x)
    }

    { case extractor(r) => r }
}

내가 놓친 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

시작 Scala 2.9, Function.unlift 정확히 다음과 같습니다.

def unlift[T, R](f: (T) => Option[R]): PartialFunction[T, R]

함수 t => 옵션 [r]을 부분 기능 [t, r]으로 바꿉니다.

다른 팁

이건 어때:

Welcome to Scala version 2.8.0.r19650-b20091114020153 (Java HotSpot(TM) Client VM, Java 1.6.0_17).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def optfToPf[X,R](f: X => Option[R]): PartialFunction[X,R] = x => f(x) match {
     |     case Some(r) => r
     | }
optfToPf: [X,R](f: (X) => Option[R])PartialFunction[X,R]

scala>

나는 당신이 Apply and isdefinedAt를 직접 대체 할 수 있다고 생각하지만, 나는 당신이 못 생겼을 때 그것을 할 것입니다.

def optfToPf[X,R](f: X => Option[R]) = new PartialFunction[X,R] {
  def apply(x: X): R = f(x).get
  def isDefinedAt(x: X): Boolean = f(x) != None
}

테스트 :

scala> val map = Map(1 -> 2)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)

scala> map(1)
res0: Int = 2

scala> def mapOpt(key: Int) = map.get(key)
mapOpt: (key: Int)Option[Int]

scala> mapOpt(1)
res1: Option[Int] = Some(2)

scala> mapOpt(2)
res2: Option[Int] = None

scala> val mapPf = optfToPf(mapOpt _)
mapPf: java.lang.Object with PartialFunction[Int,Int] = <function1>

scala> mapPf.isDefinedAt(2)
res3: Boolean = false

scala> mapPf.isDefinedAt(1)
res4: Boolean = true

scala> mapPf(1)
res5: Int = 2

scala> mapPf(2)
java.util.NoSuchElementException: None.get
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top