gpt4 book ai didi

scala - 映射 Map 的单个条目

转载 作者:行者123 更新时间:2023-12-02 07:33:19 25 4
gpt4 key购买 nike

我想要实现如下目标:

(_ : Map[K,Int]).mapKey(k, _ + 1)

mapKey 函数仅将其第二个参数 (Int => Int) 应用于存储在 k 下的值。标准库里面有东西吗?如果不是的话,我打赌 Scalaz 里肯定有东西。

当然,我可以自己编写这个函数(m.updated(k,f(m(k))),而且这样做很简单。但是我已经多次遇到过这个问题,所以也许它已经完成了?

对于 Scalaz,我想象了以下代码:

(m: Map[A,B]).project(k: A).map(f: B => B): Map[A,B]

最佳答案

你当然可以添加

def changeForKey[A,B](a: A, fun: B => B): Tuple2[A, B] => Tuple2[A, B] = { kv =>
kv match {
case (`a`, b) => (a, fun(b))
case x => x
}
}

val theMap = Map('a -> 1, 'b -> 2)
theMap map changeForKey('a, (_: Int) + 1)
res0: scala.collection.immutable.Map[Symbol,Int] = Map('a -> 2, 'b -> 2)

但这会规避有关内存重用和访问的任何优化。

我还为您提出的项目方法提出了一个相当冗长且低效的scalaz解决方案,使用 zipper :

theMap.toStream.toZipper.flatMap(_.findZ(_._1 == 'a).flatMap(elem => elem.delete.map(_.insert((elem.focus._1, fun(elem.focus._2)))))).map(_.toStream.toMap)

(for {
z <- theMap.toStream.toZipper
elem <- z.findZ(_._1 == 'a)
z2 <- elem.delete
} yield z2.insert((elem.focus._1, fun(elem.focus._2)))).map(_.toStream.toMap)

可能没什么用。我发帖仅供引用。

关于scala - 映射 Map 的单个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8817107/

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