我不确定以下功能如何运作:
def lift[A, B](f: A => B): Option[A] => Option[B] = _ map f
我知道它会转换一个函数,该函数接受A
类型的值并将类型B
的值返回到一个函数中,该函数采用类型Option[A]
的值并返回{{ 1}}。但我坚持下划线正在做什么以及地图如何运作。有人可以扩展功能定义吗?
答案 0 :(得分:2)
def lift[A, B](f: A => B): Option[A] => Option[B] = _ map f
它适用于
def lift[A, B](f: A => B): Option[A] => Option[B] = x => x map f
(这是下划线在此上下文中的工作方式)
返回类型注释为Option[A] => Option[B]
。感谢此编译器将知道x
的类型为Option[A]
。我们可以明确地说明,进一步扩展它
def lift[A, B](f: A => B): Option[A] => Option[B] = (x: Option[A]) => x map f
因此,返回的函数采用Option[A]
并使用f
对其进行映射。 Option.map
接受函数A => B
的参数,因此一切正确。
请注意,因为我注释了函数作为参数的类型,所以现在可以省略这样的提升方法类型
def lift[A, B](f: A => B) = (x: Option[A]) => x map f
我在这篇文章中写的所有片段都是等效的。
答案 1 :(得分:1)
_ map f
会返回一个带Option[A]
并返回Option[B]
的函数。
在这种情况下,_
是通过指定其参数位置来构建和返回函数的快捷方式。
所以这里是Option[A]
参数的位置。
每当进一步调用此返回函数时,它将执行:
thePassedOptionA map f