首页 > 解决方案 > 何时以及为什么要提升功能

问题描述

考虑这段代码:

def f1(a: Int, b: Int) = a + b

def f2(a: Option[Int], b: Option[Int]): Int = (a, b) match {
  case (Some(x), Some(y)) => x + y
  case _ => throw new IllegalArgumentException
}

println(f1(10, 20))
println(f2(Some(10), Some(20)))

我听说你可以“提升”f1 像 f2 一样。作为初学者,我有以下问题:

什么是起重以及为什么使用它?在实现方面,如何“提升”f1?

非常感谢任何解释,因为找到我为什么要“举起”某些东西有点棘手

标签: scalafunctional-programmingliftingoption-type

解决方案


为什么:当你有一个带有类似签名的函数f1并想在Option[Int]s(或List[Int]s 等)上“调用它”时

如何:你可以直接写它:

def lift2option[A, B, C](f: (A, B) => C): (Option[A], Option[B]) => Option[C] = ???

我将其保留为未定义,因为您应该尝试自己编写它;你的定义f2应该是一个很好的起点。请注意,我让它返回Option[Int]而不是Int. 稍后,如果您愿意,我可以编辑并给出答案。

然后,您可以执行以下操作,而不是定义f2为单独的函数:

val f2 = lift2option(f1 _)
println(f2(Some(10), Some(20)))

当然,关键是现在对于任何具有像f1您这样的签名的函数都可以获得f2等价的。

它可以进一步推广,不仅适用于Option,而且您稍后会想要研究它。


推荐阅读