代码之家  ›  专栏  ›  技术社区  ›  Alexander Azarov

如何将X=>Option[R]转换为PartialFunction[X,R]

  •  21
  • Alexander Azarov  · 技术社区  · 16 年前

    只要我们有一个 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 作为论据和回归 因此。我想做一个 部分函数[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 }
    }
    

    有没有更好的方法让我错过了?

    3 回复  |  直到 12 年前
        1
  •  35
  •   Xavier Guihot    7 年前

    启动 Scala 2.9 , Function.unlift

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

    转换函数T=>选项[R]转换为部分函数[T,R]。

        2
  •  12
  •   Eastsun    16 年前

    这个怎么样:

    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>
    
        3
  •  5
  •   Daniel C. Sobral    16 年前

    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
    
    推荐文章