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

标签 scala scalaz lenses monocle-scala

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

相关文章:

scala - 如何使用 "Seq"字段修改此嵌套案例类?

scala - 使用状态 Monad 链接多个转换

Scalaz Kleisli 使用优势

scala - 如何将 Kleisli 组合与返回验证的函数一起使用?

list - 什么是 DList?

haskell - 使用 Control.Lens 的索引列表需要 Monoid 约束

haskell - 在 Haskell 中扩展结构

scala - Akka/斯卡拉 : Can You Explain What's Going On in this Akka Streams Flow?

scala - Generic[A] 其中 A 是一个类?

Scala:更有效的过滤列表和创建 future 序列的方法