与Scala中的"提升"功能混淆

sc_*_*ray 6 scala type-inference higher-order-functions lifting map-function

Scala中的函数式编程一书中,有一个"Lift"的例子,其中一个类型的函数A => B被提升为Option[A] => Option[B].

这就是电梯的实施方式:

def lift[A,B](f: A => B):Option[A] => Option[B] = _ map f
Run Code Online (Sandbox Code Playgroud)

我对此有几个困惑:

第一个是,这里的'_'是什么?其次,当我从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
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Ric*_*tze 10

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

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

    或者,定义lift如下:

    def lift[A,B](f: A => B) = { value: Option[A] => value map f }
    
    Run Code Online (Sandbox Code Playgroud)

    在这里你明确说明了类型value,编译器可以推断出来

    • 返回的函数的返回类型是Option[B],因为f: A => B将map类型转换AB,
    • 返回类型liftOption[A] => Option[B].