我正在阅读 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/