首页 > 解决方案 > 带有柯里化函数和映射的评估顺序

问题描述

我对何时替换柯里化函数以及这可能如何影响程序性能有一些疑问。

具体来说,给定以下代码:

def curriedFun(f: Stuff => OtherStuff)(stuff: Stuff) = ...

def normalFun(stuff: Stuff): OtherStuff = ...

...

listOfListsOfStuff: List[Stuff] = ...

val otherStuff: List[OtherStuff] =
      listOfListsOfStuff.map(curriedFun(normalFun))

我的疑问涉及块的最后一次调用,更具体地说是如何map与 curried 函数交互。尤其是:

val substitutedFun = curriedFun(normalFun)
val otherStuff: List[OtherStuff] =
      listOfListsOfStuff.map(substitutedFun)

我的直觉告诉我它应该相当于预先替换函数(第一个选项),但我真的不明白为什么,我不知道在哪里看......

标签: scalacurrying

解决方案


方法的参数是在调用方法之前计算的(除非参数是按名称命名的)。所以参数 to map是在调用之前计算map的。

所以在这种情况下,curriedFun(normalFun)计算一次给一个函数,然后这个函数被传递给map. map然后将此函数应用于 的每个元素listOfListsOfStuff。to 的参数是由柯里化函数生成的这一事实map与执行顺序无关。


推荐阅读