How to convert X => Option[R] to PartialFunction[X,R]

后端 未结 3 1389
一整个雨季
一整个雨季 2020-12-17 08:40

As long as we have a PartialFunction[X,R] it\'s very easy to convert it to a function returning Option[R], e.g.

def pfToOptf[X, R](         


        
相关标签:
3条回答
  • 2020-12-17 09:31

    How about this:

    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>
    
    0 讨论(0)
  • 2020-12-17 09:36

    Starting Scala 2.9, Function.unlift does precisely this:

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

    Turns a function T => Option[R] into a PartialFunction[T, R].

    0 讨论(0)
  • 2020-12-17 09:43

    I suppose you could override apply and isDefinedAt by hand, but I'd do it the way you find ugly.

    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
    }
    

    Testing:

    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
    
    0 讨论(0)
提交回复
热议问题