无形可扩展记录的相等性取决于字段顺序

Equality of shapeless extensible records depends on field order

这两条记录有相同的字段,相同的值,但顺序不同:

val person1 = ("age" ->> 34) :: ("name" ->> "Jane") :: HNil
val person2 = ("name" ->> "Jane") :: ("age" ->> 34) :: HNil

当我使用==时,这些不被认为是相等的,因为字段的顺序不同。它们是 HLists,所以在检查是否相等时顺序很重要对我来说是有意义的,但我觉得作为彼此排列的记录应该是相等的。我也觉得他们应该有相同的类型,但他们没有,因为他们是 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