与Scala中的“提升”功能混淆

时间:2013-06-22 23:26:29

标签: scala type-inference higher-order-functions map-function lifting

在书籍Functional Programming In Scala中,有一个“提升”示例,其中类型为A => B的函数被提升为Option[A] => Option[B]

这是电梯的实施方式:

def lift[A,B](f: A => B):Option[A] => Option[B] = _ map f

我对此有几点疑惑:

第一个是,这里的'_'是什么?其次,当我从def中删除返回类型时,期望类型推断能够发挥其魔力,我得到以下异常:

scala> def lift[A,B](f: A => B) =  _ map f
<console>:7: error: missing parameter type for expanded function ((x$1) => x$1.map(f))
       def lift[A,B](f: A => B) =  _ map f

有人能解释一下这里发生了什么吗?

由于

1 个答案:

答案 0 :(得分:10)

  1. lift是一个返回函数的函数。通过将函数f应用于该值,函数返回提升一个值(未命名)。要解除的未命名值称为_。你当然可以给它一个更明确的名字:

    def lift[A,B](f: A => B): Option[A] => Option[B] = { value => value map f }
    
  2. 该函数的返回类型(返回的函数)需要显式声明或隐式确定。如编写的那样,编译可以推断出要返回的是Option[B](更具体地说,lift正在返回函数Option[A] => Option[B](显式声明),而该函数的返回类型为{{ 1}}(隐含地确定))。如果没有该类型信息,编译器需要一些其他指示返回类型的信息。

    或者,定义Option[B]因此:

    lift

    这里你明确说明def lift[A,B](f: A => B) = { value: Option[A] => value map f } 的类型,编译器可以推断出

    • 返回的函数的返回类型为value,因为Option[B]会将类型f: A => B映射到A
    • B的返回类型为lift