无形可扩展记录的相等性取决于字段顺序
Equality of shapeless extensible records depends on field order
这两条记录有相同的字段,相同的值,但顺序不同:
val person1 = ("age" ->> 34) :: ("name" ->> "Jane") :: HNil
val person2 = ("name" ->> "Jane") :: ("age" ->> 34) :: HNil
当我使用==
时,这些不被认为是相等的,因为字段的顺序不同。它们是 HList
s,所以在检查是否相等时顺序很重要对我来说是有意义的,但我觉得作为彼此排列的记录应该是相等的。我也觉得他们应该有相同的类型,但他们没有,因为他们是 HList
的。
有没有办法让记录的值和类型相等,从而更像我期望的那样?另外,以这种方式实施的原因是什么?可以用 HMap
代替吗?
您可以使用 Align
来完成类似的操作。
import shapeless._, syntax.singleton._, record._, ops.hlist._
def permutatedEqual[R1 <: HList, R2 <: HList](
r1: R1, r2: R2
)(implicit
align: Align[R1, R2]
): Boolean = align(r1) == r2
您可以将其用作:
permutatedEqual(person1, person2) // Boolean = true
这两条记录有相同的字段,相同的值,但顺序不同:
val person1 = ("age" ->> 34) :: ("name" ->> "Jane") :: HNil
val person2 = ("name" ->> "Jane") :: ("age" ->> 34) :: HNil
当我使用==
时,这些不被认为是相等的,因为字段的顺序不同。它们是 HList
s,所以在检查是否相等时顺序很重要对我来说是有意义的,但我觉得作为彼此排列的记录应该是相等的。我也觉得他们应该有相同的类型,但他们没有,因为他们是 HList
的。
有没有办法让记录的值和类型相等,从而更像我期望的那样?另外,以这种方式实施的原因是什么?可以用 HMap
代替吗?
您可以使用 Align
来完成类似的操作。
import shapeless._, syntax.singleton._, record._, ops.hlist._
def permutatedEqual[R1 <: HList, R2 <: HList](
r1: R1, r2: R2
)(implicit
align: Align[R1, R2]
): Boolean = align(r1) == r2
您可以将其用作:
permutatedEqual(person1, person2) // Boolean = true