检查无形状可扩展记录之间的子类型关系

2023-12-27

我有两个无形的可扩展记录,person and employee. The 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 and person。我想将这两个对象视为persons 并检查它们是否相等。我怎样才能做到这一点?


  • 如何检查一条记录是否是另一条记录的子类型?

您可以查看此存储库中的 Extractor 类型类。它实现了深度和宽度子类型。

https://github.com/eugengarkusha/RecordsDeepMerge https://github.com/eugengarkusha/RecordsDeepMerge

  • 我希望能够在编译时和运行时执行此操作

子类型关系在编译时被见证。 使用 Extractor 类型类(来自提到的存储库)从子记录中获取超级记录的所有字段。

  • 我还希望能够比较员工和个人的共享组成部分。我想将两个对象视为人并检查它们是否相等。我怎样才能做到这一点?

(使用提到的存储库中的代码):

 type PersonId = Record.`"first name" ->String, "last name" ->String`.T
 type Person = Record.`"id" -> PersonId, "city" -> String`.T 
 employee1.deepExtract[Person] == employee2.deepExtract[Person]
  • 我想静态验证函数不会从记录中删除任何字段。因此,我的函数可以将一个人转变为一名员工,但如果它删除了“城市”或“id”字段,则程序不应编译。

在这种情况下不需要子类型检查:

def personToEmployee(p: Person): Employee = ???

类型检查器不会让您删除城市或 ID 字段

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查无形状可扩展记录之间的子类型关系 的相关文章

随机推荐