【问题标题】:Confusion with 'lifting' functions in Scala对 Scala 中的“提升”功能感到困惑
【发布时间】:2013-06-19 19:51:32
【问题描述】:

Functional Programming In 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

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

谢谢

【问题讨论】:

    标签: scala type-inference higher-order-functions map-function lifting


    【解决方案1】:
    1. lift 是一个返回函数的函数。该函数通过将函数f 应用于该值返回提升一个值(未命名)。要提升的未命名值称为_。你当然可以给它一个更明确的名字:

      def lift[A,B](f: A => B): Option[A] => Option[B] = { value => value map f }
      
    2. 该函数的返回类型(被返回的那个)需要显式声明或隐式确定。如所写,编译可以推断要返回的是Option[B](更具体地说,lift 正在返回一个函数Option[A] =&gt; Option[B](明确说明),而该函数的返回类型为Option[B](隐式确定)) .如果没有该类型信息,编译器需要一些其他指示返回类型是什么。

      或者,这样定义lift

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多