gpt4 book ai didi

scala - 使用单片眼镜/scala 镜片时的权益成本

转载 作者:行者123 更新时间:2023-12-04 17:54:11 25 4
gpt4 key购买 nike

我正在阅读 Diode ,这让我想到了 Monocle 中的镜头/Scalaz :

如果我(有条件地)使用 Monocle 深入修改深层嵌套数据结构的某些部分/Scalaz lens 并想比较是否有变化,是否需要进行深入比较,或者有没有办法使用引用相等性来查看两个数据结构(有条件修改之前和之后)是否相同?

换句话说:

val f_new=modifyWithMonocleIfTheSunIsUp(f_old)

在根(f_old, f_new ) 的数据结构 ?

换句话说,

f_new==f_old 是否为真 当且仅当 f_new.eq(f_old) 为真? (等式 1)

如果不是,为什么不呢?

如果不是,是否可以使等式 1 为真?怎么样?

最佳答案

也许你可以使用 modifyF 而不是 modify 来返回一个 Option 这样你就不必检查是否有什么改变了。

例如:

import monocle.Lens
import monocle.macros.GenLens
import scalaz.std.option._

case class Person(name: String, address: Address)
case class Address(street: String, number: Int)

val addressL: Lens[Person, Address] = GenLens[Person](_.address)
val streetL: Lens[Address, String] = GenLens[Address](_.street)

val changePersonsStreet: Person => Option[Person] =
(addressL composeLens streetL).modifyF[Option] { street =>
// only change street name if first letter comes before 'N'
street.headOption.filter(_.toString.capitalize < "N").map(_ => "New Street")
// or any other condition
// if (theSunIsUp) Some("changed street name") else None
} _

val alice = Person("Alice", Address("Main Street", 1))

val alice2: Option[Person] = changePersonsStreet(alice)
// Some(Person(Alice,Address(New Street,1)))
// -> modified, no need to check

val alice3 = alice2.flatMap(changePersonsStreet)
// None
// -> not modified

关于scala - 使用单片眼镜/scala 镜片时的权益成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41780409/

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