【发布时间】:2017-05-02 06:00:13
【问题描述】:
我有两个无形可扩展记录,person 和 employee。 employee 记录在某种意义上是person 的子类型,因为它具有person 所做的所有字段,并且这些字段都是person 中相应字段的子类型:
import shapeless._ ; import syntax.singleton._ ; import record._
val employeeId = ("first name" ->> "Jane") :: ("last name" ->> "Doe") :: ("title" ->> "software engineer") :: HNil
val employee =
("id" ->> employeeId) ::
("city" ->> "San Francisco") ::
("company" ->> "Generic Inc.") ::
HNil
val personId = ("first name" ->> "Jane") :: ("last name" ->> "Doe") :: HNil
val person =
("id" ->> personId) ::
("city" ->> "San Francisco") ::
HNil
如何检查一个记录是否是另一个记录的子类型?我希望能够在编译时和运行时做到这一点。我想到的一个用例是我想静态验证一个函数不会从记录中删除任何字段。因此,我的函数可以采用 person 并将其转换为 employee,但如果它删除了“city”或“id”字段,则程序不应编译。
我还希望能够比较employee 和person 的共享组件。我想将这两个对象都视为persons 并检查它们是否相等。我该怎么做?
【问题讨论】: