Scala中“lifting”函数的困惑

7
Scala函数式编程这本书中,有一个'Lift'的例子,其中一个类型为A => B的函数被提升为Option[A] => Option[B]
以下是lift的实现方式:
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个回答

11
  1. lift 是一个返回函数的函数。所返回的函数通过将函数 f 应用于被提升的值(未命名)来进行提升。被提升的未命名值称为 _。你可以给它一个更明确的名称:

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接