scala - 何时以及为什么要提升功能
问题描述
考虑这段代码:
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?
非常感谢任何解释,因为找到我为什么要“举起”某些东西有点棘手
解决方案
为什么:当你有一个带有类似签名的函数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
,而且您稍后会想要研究它。
推荐阅读
- oracle11g - 如何在 Apache Nifi 中读取仅重复一次的数据?
- spring-boot - 在 Fargete ECS 集群中引用 Docker 容器的环境变量
- mips - 如何将 jr $ra 直接放到正确的位置?
- python - 在 MAC 上安装 anaconda 后无法使用 conda
- ssl - 自签名 https gitlab
- reactjs - 使用 React 在页面上滚动可见
- java - 在java中使用函数式风格有什么好处?
- java - 休眠两级级联不适用于显式清除 Set
- python - 如何在遍历python中的列表时标记编码
- java - ms word的图像在我打开后10秒后消失