我比较了在Scala中定义higher-order function的两种方法:
def f1(elem: Int)(other: Int) = (elem == other)
def f2(elem: Int) = (other: Int) => (elem == other)
字符串
第一个使用currying,第二个使用anonymous function。
我想知道这两种方法在Scala如何实现它们方面有什么区别,如果有的话,哪个版本更好?
备注:Scala现在已经停止使用第一种方法,因为它支持 * 多参数列表 *。查看链接文档了解更多细节。
1条答案
按热度按时间j2qf4p5b1#
实现与Scala编译器有很大的不同。curry版本通过取消curry参数来编译为Java方法:
字符串
第二个版本是一个返回匿名函数(
Function1
)的方法,所以它们的签名完全不同。尽管它们经常在Scala代码中互换使用,但在第二个版本中生成的代码要多得多:型
我只会在我明确希望使用
Function1
对象的情况下考虑使用第二个版本。然而,我个人倾向于使用curried版本,因为你仍然可以在部分应用第一个版本的情况下获得Function1
。curried版本同样强大,但不会在你不需要的时候创建Function1
对象。型