gpt4 book ai didi

scala - Scala 中的不可变数据结构

转载 作者:行者123 更新时间:2023-12-01 09:13:46 24 4
gpt4 key购买 nike

我正在尝试实现一个对 IT 网络和实例(计算机)建模的不可变数据结构。这是一个简化版本:

object Sample {

case class Instance(id: String, flag: Boolean)
case class Network(id: String, instances: Set[Instance])
case class Repo(networks: Map[String, Set[Network]])

// return new Repo with the instance with id == instanceId updated
// how to do this using lenses?
def updateInstanceFlag(networksKey: String, instanceId: String, flag: Boolean): Repo = ???
}

updateInstanceFlag 函数应该创建一个更新的数据副本,并修改相应的实例(带有 id instanceId)。我试着用镜头来实现这个,但代码太复杂了。具体来说,我很难将通过 ID 定位实例或网络与更新数据结构结合起来。从查询中返回可选值也增加了镜头的复杂性。我使用自己的镜头实现,但没有真正的偏好(我知道 Shapeless、Monocle、Scalaz 的镜头实现)。

我很感激人们对如何维护“真实”不可变数据的想法和经验。

谢谢。

最佳答案

如果我能说服您将 Networkinstances 字段也更改为 Map,您可以相当合理地做到这一点:

object Sample {

case class Instance(id: String, flag: Boolean)
case class Network(id: String, instances: Map[String, Instance])
case class Repo(networks: Map[String, Set[Network]])

// return new Repo with the instance with id == instanceId updated
// how to do this using lenses?
def updateInstanceFlag(repo: Repo, networksKey: String,
instanceId: String, flag: Boolean): Repo = {

val nets0 = repo.networks
val net0 = nets0(networksKey) // TODO fail gracefully
val inst0 = net0.instances(instanceId) // TODO fail gracefully
val inst1 = inst0.copy(flag = flag)
val net1 = net0 + (instanceId -> inst1)
val nets1 = nets0 + (networksKey -> net1)

repo.copy(networks = nets1)
}

}

由于代码下降和重新上升的对称性可能已经变得很明显,因此可能值得在一个可以更新单个网络上的实例标志的方法中分解出一些部分:

def updateInstanceFlag(net: Network, instanceId: String,
flag: Boolean): Repo = {

val inst1 = net.instances(instanceId).copy(flag = flag)
net.copy(instances = net.instances + (instanceId -> inst1))
}

def updateInstanceFlag(repo: Repo, networksKey: String,
instanceId: String, flag: Boolean): Repo = {

val net1 = updateInstanceFlag(repo.networks(networksKey), instanceId, flag)
repo.copy(networks = repo.networks + (networksKey -> net1))
}

关于scala - Scala 中的不可变数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25257259/

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