我看了一下:Scala currying vs partially applied functions,但那里的答案更多地回答了Scala中currying,partial application和normal函数之间的功能和语义差异。
我有兴趣了解这些可用于功能的不同技术之间是否存在性能因素,即...
如果我们使用普通函数的性能作为基础:
def add3(a: Int, b: Int, c: Int) = a + b + c
add3(1, 2, 3)
然后比较:
// First
(add3 _).curried(1)(2)(3)
// Second
val add2 = add3(1, _: Int, _: Int)
val add1 = add2(2, _: Int)
add1(3)
// Third
def add3(a: Int)(b: Int)(c: Int) = a + b + c
add3(1)(2)(3)
如果我发现一些性能不佳的代码(无论是在速度还是内存使用方面),我可能想要注意的是什么?我看到在所述代码段中发生了很多currying或部分应用?< / p>
例如,在Haskell中,我会看看有多少个thunk正在生成和闲逛。我认为Scala使用类似的方法来传递部分应用和curried函数,Scala如何处理这些事情的细节将是很有价值的。