6

在书Functional Programming In Scala中,有一个'Lift'的例子,其中A => B类型的函数被提升为Option[A] => Option[B]Scala中的'提升'功能混淆

这是如何提升实现:

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 

有人可以解释这是怎么回事呢?

感谢

回答

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](明确指出),而该函数的返回类型为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变为Option[A] => Option[B]