考虑以下代码:
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
,而且以后还要研究它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句