使用“Scala中的函数编程”中的eta扩展来“提升”?

时间:2014-10-21 01:13:26

标签: scala functional-programming

Scala中的功能编程的第4.3.2节中,我不太了解函数的定义。我可以看到它有效,但我不确定为什么。

   def lift[A,B](f: A => B): Option[A] => Option[B] = _ map f 

在上面的陈述中是' _' eta扩张?我可以告诉你,ScalaIDE(eclipse插件)告诉我它是一个选项[A]。所以你当然可以改写上面的内容:

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

但我想知道的是编译器如何知道 _ 将成为第一个定义中的选项[A]。它真的和#34一样简单;因为返回类型表示我们正在定义一个函数,该函数将选项[A]作为它的参数&#34 ;?

1 个答案:

答案 0 :(得分:2)

  

在上面的陈述中,'_'是eta扩展吗?

此上下文中的_是lambda表达式的简写,与...完全等效 (oa => oa map f)

  

因为返回类型表示我们正在定义一个以Option [A]作为参数的函数

是。你可能在这里缺少的是函数是Scala中的值。 lift的返回类型为Option[A] => Option[B],因此在表达式(oa => oa map f)中,oa必须为Option[A]类型。