Стоимость равенства при использовании линз monocle/scalaz

Я читал о Diode, и это заставило меня задуматься о линзах в Monocle / Scalaz:

Если я (условно) глубоко изменяю некоторую часть глубоко вложенной структуры данных, используя линзу Monocle / Scalaz, и хочу сравнить, было ли изменение, нужно ли проводить глубокое сравнение или есть способ использовать равенство ссылок чтобы увидеть, совпадают ли две структуры данных (до условной модификации и после)?

Другими словами:

val f_new=modifyWithMonocleIfTheSunIsUp(f_old)

Можно сравнение f_new==f_old стать эффективным, используя равенство ссылок (eq) в корне (f_old, f_new) структуры данных?

Другими словами,

это правда, что f_new==f_old верно тогда и только тогда, когда f_new.eq(f_old) правда? (Equation 1)

Если нет, то почему нет?

Если нет, то можно ли сделать Equation 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
Другие вопросы по тегам