scala - 带有柯里化函数和映射的评估顺序
问题描述
我对何时替换柯里化函数以及这可能如何影响程序性能有一些疑问。
具体来说,给定以下代码:
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 函数交互。尤其是:
- 柯里化替换只发生一次吗?ie 在性能方面与此代码等效:
val substitutedFun = curriedFun(normalFun)
val otherStuff: List[OtherStuff] =
listOfListsOfStuff.map(substitutedFun)
- 或者它是否为列表的每个元素替换一次
otherStuff
?
我的直觉告诉我它应该相当于预先替换函数(第一个选项),但我真的不明白为什么,我不知道在哪里看......
解决方案
方法的参数是在调用方法之前计算的(除非参数是按名称命名的)。所以参数 to map
是在调用之前计算map
的。
所以在这种情况下,curriedFun(normalFun)
计算一次给一个函数,然后这个函数被传递给map
. map
然后将此函数应用于 的每个元素listOfListsOfStuff
。to 的参数是由柯里化函数生成的这一事实map
与执行顺序无关。
推荐阅读
- javascript - 添加动态元素javascript时保持样式
- javascript - 使用 lodash 比较两个不同长度的数组
- javascript - CSS动画 - 在标题旁边从左到右滑入
- javascript - 从服务器向客户端发送媒体流
- scheme - 为什么是“eq”?在以下情况下评估为假,否则为真?
- java - Java SQL 异常:关闭结果集:即使连接或结果集都没有关闭
- javascript - 使用 JS 制作自定义 Facebook 分享按钮
- python - python脚本中的数学语法错误
- ruby-on-rails - 渲染:带有 URL 参数的新
- reactjs - 导航出同一主机上的 react-router 单页应用程序