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

时间:2015-09-27 19:16:33

标签: scala shapeless

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

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

当我使用==时,这些被认为是不相同的,因为字段的顺序不同。它们是HList s,因此在检查相等性时,顺序很重要,但我觉得相互排列的记录应该是平等的。我也觉得他们应该有相同类型,但他们没有,因为他们是HList

有没有办法让记录的值和类型相等,更符合我的预期?另外,这种方式实施的原因是什么?是否可以使用HMap代替?

1 个答案:

答案 0 :(得分:6)

您可以使用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