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
lift是一个返回函数的函数.返回的函数通过将函数应用于该值来提升值(未命名)f.要取消的未命名值被称为_.你当然可以给它一个更明确的名字:
def lift[A,B](f: A => B): Option[A] => Option[B] = { value => value map f }
Run Code Online (Sandbox Code Playgroud)该函数的返回类型(返回的函数)需要显式声明或隐式确定.如编写的那样,编译可以推断出要返回的是一个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类型转换A为B,lift为Option[A] => Option[B].