3

我正在阅读有关Diode的信息,它让我想到了Monocle / Scalaz中的镜头:

如果我(有条件地)使用Monocle / Scalaz镜头对深度嵌套数据结构的某些部分进行深度修改,并且想要比较是否有变化,是否需要进行深度比较,或者有没有办法使用参考相等看看这两个数据结构(有条件修改之前和之后)是否相同?

换句话说:

val f_new=modifyWithMonocleIfTheSunIsUp(f_old)

在数据结构的根 ( , ) 处使用引用相等 ( )可以使比较f_new==f_old有效吗?eqf_oldf_new

换句话说,

当且仅当f_new==f_old是真的时,它是真的吗? f_new.eq(f_old)(Equation 1)

如果不是,为什么不呢?

如果没有,是否有可能使Equation 1true ?如何 ?

4

1 回答 1

1

也许您可以使用modifyF而不是modify返回 an 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
于 2017-01-21T23:51:29.540 回答