"a") val m2 = Map("a" -> 1) 作为合并这两者的结果,我想得到 Map("a" -> ("a",1)) 我为此-6ren">
gpt4 book ai didi

Scala 合并两个具有不同值类型的映射

转载 作者:行者123 更新时间:2023-12-02 01:53:27 25 4
gpt4 key购买 nike

给定两张 map

  val m1 = Map("a" -> "a")
val m2 = Map("a" -> 1)

作为合并这两者的结果,我想得到

Map("a" -> ("a",1))

我为此尝试了猫半群,它几乎完成了工作,但我必须自己创建半群的实例,就像这样

Semigroupal.catsSemigroupalForMap[String]

然后将它们与product方法合并。我需要做什么才能不手动创建它?例如。合并两个选项很简单

val noneInt: Option[Int] = None
val some3: Option[Int] = Some(3)
Semigroupal[Option].product(noneInt, some)

我想实现类似的代码来合并两个 map ,但是在定义时

Semigroupal[Map]

编译器找不到它的任何隐式内容。

最佳答案

tupled 似乎可以解决问题:

@ val mapA = Map(1 -> 2)
mapA: Map[Int, Int] = Map(1 -> 2)

@ val mapB = Map(1 -> "b")
mapB: Map[Int, String] = Map(1 -> "b")

@ (mapA, mapB).tupled
res4: Map[Int, (Int, String)] = Map(1 -> (2, "b"))

并且它可以通用编译:

@ def mergeMaps[A, B, C](m1: Map[A, B], m2: Map[A, C]): Map[A, (B, C)] = (m1, m2).tupled
defined function mergeMaps

@ mergeMaps(mapA, mapB)
res6: Map[Int, (Int, String)] = Map(1 -> (2, "b"))

它会销毁不在两个映射中的键:

@ val m1 = Map("a" -> "foo", "b" -> "bar")
m1: Map[String, String] = Map("a" -> "foo", "b" -> "bar")

@ val m2 = Map("a" -> 1, "c" -> 3)
m2: Map[String, Int] = Map("a" -> 1, "c" -> 3)

@ mergeMaps(m1, m2)
res9: Map[String, (String, Int)] = Map("a" -> ("foo", 1))

关于Scala 合并两个具有不同值类型的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69905538/

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