scala – 为什么使用foldLeft而不是程序版?
因此,在阅读
this question时,有人指出,而不是程序代码:
def expand(exp: String,replacements: Traversable[(String,String)]): String = { var result = exp for ((oldS,newS) <- replacements) result = result.replace(oldS,newS) result } 您可以编写以下功能代码: def expand(exp: String,String)]): String = { replacements.foldLeft(exp){ case (result,(oldS,newS)) => result.replace(oldS,newS) } } 我几乎肯定会编写第一个版本,因为熟悉程序或函数样式的编码人员可以轻松阅读和理解它,而只有熟悉函数风格的编码人员才能轻松阅读和理解第二个版本. 但暂时将可读性放在一边,有没有什么能让foldLeft成为比程序版本更好的选择?我可能认为它会更有效率,但事实证明implementation of foldLeft实际上只是上面的程序代码.那么它只是一种风格选择,还是有充分的理由使用一个版本或另一个版本? 编辑:为了清楚,我不是在询问其他功能,只是foldLeft.我对使用foreach,map,filter等非常满意,这些都可以很好地映射到for-comprehension. 答:这里有两个很好的答案(由delnan和Dave Griffith提供),即使我只能接受一个: >使用foldLeft,因为还有其他优化,例如使用while循环,它比for循环更快. 解决方法
它更短更清晰 – 是的,您需要知道什么是折叠才能理解它,但是当您使用50%功能的语言进行编程时,您应该知道这些基本构建块.折叠正是程序代码所做的(重复应用操作),但它给出了一个名称并进行了概括.虽然它只是一个小轮子你正在重新发明,但它仍然是一个轮子改造.
如果foldLeft的实现应该获得一些特殊的好处 – 比如说,额外的优化 – 你可以免费获得它,而无需更新无数的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |