我正在尝试实现一个不可变的数据结构来模拟 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 的镜头实现)。
我很欣赏人们关于如何维护“真实”不可变数据的想法和经验。
谢谢。