gpt4 book ai didi

scala - 以 scalaz.NonEmptyList[A] 作为成员和 ===、equals、== 的 case 类

转载 作者:行者123 更新时间:2023-12-04 05:23:43 25 4
gpt4 key购买 nike

我想将案例类与 scalaz 进行比较 NonEmptyList场。 ==euqls不起作用,我知道这是因为 NonEmptyList.equals检查比较对象是否与调用者相同的实例的方法。另一方面,scalaz ===函数适用于 NonEmptyList前提是必须有隐式 Equals范围内。

问题是我想让我的案例类通用,并希望它的实例易于比较。

如何做到这一点?

如果唯一的解决方案是提供定制 def equals(obj: Any): Boolean方法,请在下面发布。

我的代码:

object Problem {

case class CC[M, N](s: M, nel: NonEmptyList[N])

CC(1, 2.wrapNel) == CC(1, 2.wrapNel) //false

CC(1, 2.wrapNel) equals CC(1, 2.wrapNel) //false


implicit def cCEquals[M, N] = equalA[CC[M, N]]

CC(1, 2.wrapNel) === CC(1, 2.wrapNel) //false

//override def equals(obj: Any): Boolean = ???
}

最佳答案

我知道它可能对您没有帮助,但是 equals方法在 NonEmptyList在 Scalaz 7 中按预期工作。(编辑:实际上这也是 now fixed in Scalaz 6,所以如果您愿意从源代码构建或等待 6.0.5,无论如何您都可以。)

使用 Equal 仍然有一种自然的方法可以解决此问题但是,在 Scalaz 6.0.4 或更早版本中,您只需要确保构建正确的 Equal CC[M, N] 的实例:

implicit def ccEqual[M: Equal, N: Equal] =
Equal.equalBy[CC[M, N], (M, NonEmptyList[N])] {
case CC(s, nel) => (s, nel)
}

这里我们要求 MNEqual实例。然后编译器可以构建一个 Equal NonEmptyList[N] 的实例然后为 (M, NonEmptyList[N]) .并且有一个明显的映射来自 CC[M, N](M, NonEmptyList[N]) ,我们可以使用 Equal.equalBy 将其转换为所需的实例.

如果您愿意对 M 使用普遍平等和 N ,你可以这样做:
implicit def ccEqual[M, N] = new Equal[CC[M, N]] {
def equal(a: CC[M, N], b: CC[M, N]) =
a.s == b.s && Equal.NonEmptyListEqual(Equal.equalA[N]).equal(a.nel, b.nel)
}

或者甚至只是:
implicit def ccEqual[M, N] = new Equal[CC[M, N]] {
def equal(a: CC[M, N], b: CC[M, N]) = a.s == b.s && a.nel.list == b.nel.list
}

使用一点类型级魔法(例如通过 Scalaz 7 的 typelevel 或更容易使用 Shapeless ),您可以让编译器生成 Equal具有 Equal 的任何案例类的实例其成员的实例,但自己将它们写出来并不难。

关于scala - 以 scalaz.NonEmptyList[A] 作为成员和 ===、equals、== 的 case 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440324/

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