7

在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

有人可以解释这里发生了什么吗?

谢谢

4

1 回答 1

11
  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](明确说明),而该函数具有返回类型Option[B](隐式确定))。如果没有该类型信息,编译器需要一些其他指示返回类型是什么。

    或者,lift这样定义:

    def lift[A,B](f: A => B) = { value: Option[A] => value map f }
    

    在这里,您明确说明了 的类型value,编译器可以推断

    • 返回函数的返回类型为Option[B],因为f: A => B将类型映射AB
    • liftto be的返回类型Option[A] => Option[B]
于 2013-06-22T23:51:02.233 回答