gpt4 book ai didi

scala - 为什么使用 foldLeft 而不是程序版本?

转载 作者:行者123 更新时间:2023-12-04 08:58:32 26 4
gpt4 key购买 nike

所以在阅读中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, replacements: Traversable[(String, String)]): String = {
replacements.foldLeft(exp){
case (result, (oldS, newS)) => result.replace(oldS, newS)
}
}

我几乎肯定会写第一个版本,因为熟悉过程式或函数式风格的程序员可以轻松阅读和理解它,而只有熟悉函数式风格的程序员才能轻松阅读和理解第二个版本。

但是暂时将可读性放在一边,是否有什么可以使 foldLeft比程序版本更好的选择?我可能认为它会更有效,但事实证明 implementation of foldLeft实际上只是上面的程序代码。那么这只是一种风格选择,还是有充分的理由使用一个或另一个版本?

编辑:为了清楚起见,我不是在问其他功能,只是 foldLeft .我对 foreach 的使用非常满意, map , filter等,它们都很好地映射到 for-comprehensions。

答案:这里确实有两个很好的答案(由 delnanDave Griffith 提供),尽管我只能接受一个:
  • 使用 foldLeft因为还有其他优化,例如使用 while 循环会比 for 循环快。
  • 使用 fold如果它被添加到常规集合中,因为这将使向并行集合的过渡变得微不足道。
  • 最佳答案

    它更短更清晰 - 是的,您需要知道折叠是什么才能理解它,但是当您使用 50% 功能的语言进行编程时,无论如何您都应该知道这些基本构建块。折叠正是程序代码所做的(重复应用操作),但它被赋予了一个名称并被概括。虽然它只是你重新发明的一个小轮子,但它仍然是一个轮子重新发明。

    如果 foldLeft 的实现应该得到一些特殊的好处——比如额外的优化——你可以免费得到它,而无需更新无数方法。

    关于scala - 为什么使用 foldLeft 而不是程序版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5460213/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com