gpt4 book ai didi

scala - 用 Map 而不是 List 理解 foldLeft

转载 作者:行者123 更新时间:2023-12-02 08:21:07 26 4
gpt4 key购买 nike

我想了解如何foldLeft适用于 map 。如果我有一个 List 并使用零元素和一个函数调用它 foldLeft ,我确实理解它是如何工作的:

val list1 = List(1,2,3)
list1.foldLeft(0)((a,b) => a + b)

我添加零元素的地方 0list1 的第一个元素然后添加 list1 的第二个元素等等。所以输出成为新的输入,第一个输入是零元素。

现在我得到了代码
val map1 = Map(1 -> 2.0, 3 -> 4.0, 5 -> 6.2) withDefaultValue 0.0
val map2 = Map(0 -> 3.0, 3 -> 7.0) withDefaultValue 0.0
def myfct(terms: Map[Int, Double], term: (Int, Double)): Map[Int, Double] = ???

map1.foldLeft(map2)(myfct)
  • 所以我这里的第一个元素是 Tuple2 ,但由于 map2Map而不是 Tuple2 ,什么是零元素?
  • 当我们有一个 List ,即 list1 ,我们总是“在 list1 中取下一个元素”。 map1 中的“下一个元素”是什么?是另一对 map1 吗?
  • 最佳答案

    在这种情况下,您可以想到 Map作为元组列表。您可以创建这样的列表:List(1 -> 2.0, 3 -> 4.0, 5 -> 6.2) , 并调用 foldLeft在它上面(这或多或少正是 Map.foldLeft 所做的)。如果您了解如何foldLeft适用于列表,那么现在您也知道它如何与 Maps 一起使用了 :)
    要回答您的具体问题:

  • foldLeft的第一个参数可以是任何类型。您可以传入 Map而不是 Int在你的第一个例子中也是如此。它不必与您正在处理的集合元素的类型相同(尽管它可能是),就像您在第一个示例中所做的那样,也不必与集合本身的类型相同,因为您在最后一个例子中有它。
    考虑一下这个例子:
     List(1,2,3,4,5,6).foldLeft(Map.empty[String,Int]) { case(map,elem) => 
    map + (elem.toString -> elem)
    }

  • 这产生与 list.map { x => x.toString -> x }.toMap 相同的结果.如您所见,这里的第一个参数是 Map ,这两者都不是 List也不是 Int .
    您传递给 foldLeft 的类型也是它返回的类型,以及你传入的函数返回的类型。它不是“元素零”。 foldLeft将该参数与列表的第一个元素一起传递给您的 reducer 函数。您的函数将组合这两个元素,并生成与第一个参数相同类型的新值。该值再次传入,再次与第二个元素......等。
    也许,检查 foldLeft 的签名会有所帮助:
       foldLeft[B](z: B)(op: (B, A) ⇒ B): B
    这里 A是你的集合元素的类型, B可以是任何东西,唯一的要求是它出现的四个地方的类型相同。
    这是另一个例子,它(几乎)等价于 list.mkString(",") :
       List(1,2,3,4,5,6).foldLeft("") { 
    case("", i) => i.toString
    case(s,i) => s + "," + i
    }
  • 正如我在开头所解释的,这种上下文中的映射是一种列表(而不是序列)。就像处理列表时“我们总是取列表的下一个元素”一样,在这种情况下我们将取“ map 的下一个元素”。你自己说过, map 的元素是元组,所以这就是下一个元素的类型:
     Map("one" -> 1, "two" -> 2, "three" -> 3)
    .foldLeft("") {
    case("", (key,value)) => key + "->" + value
    case(s, (key,value)) => s + ", " + key + "->" + value
    }
  • 关于scala - 用 Map 而不是 List 理解 foldLeft,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37070203/

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