Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 检查shapeless中可扩展记录之间的子类型关系_Scala_Shapeless - Fatal编程技术网

Scala 检查shapeless中可扩展记录之间的子类型关系

Scala 检查shapeless中可扩展记录之间的子类型关系,scala,shapeless,Scala,Shapeless,我有两个不成形的可扩展记录,person和employee。employee记录在某种意义上是person的一个子类型,因为它具有person所具有的所有字段,并且这些字段都是person中相应字段的子类型: import shapeless._ ; import syntax.singleton._ ; import record._ val employeeId = ("first name" ->> "Jane") :: ("last name" ->> "Doe

我有两个不成形的可扩展记录,
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
如何检查一条记录是否是另一条记录的子类型?我希望能够在编译时和运行时都做到这一点。我想到的一个用例是,我想静态地验证函数是否没有从记录中删除任何字段。因此,我的函数可以将
个人
转换为
员工
,但如果它删除了“city”或“id”字段,则程序不应编译

我还希望能够比较
employee
person
的共享组件。我想将这两个对象都看作是
person
s,并检查它们是否相等。我该怎么做?

  • 如何检查一条记录是否是另一条记录的子类型
您可以在这个repo中查看提取器类型类。它同时实现深度和宽度子类型

  • 我希望能够在编译时和运行时都做到这一点
在编译时可以看到子类型关系。 使用提取器类型类(来自提到的repo)从sub-record获取super-record的所有字段

  • 我还希望能够比较employee和person的共享组件。我想将这两个对象都视为人,并检查它们是否相等。我该怎么做
(使用上述回购协议中的代码):

  • 我想静态地验证函数是否没有从记录中删除任何字段。所以我的函数可以将一个人转换成一个雇员,但是如果它删除了“city”或“id”字段,程序就不应该编译
在这种情况下,不需要子类型检查:

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

类型检查器不允许您删除城市或id字段

此功能将在2.3.3中以不成形形式出现
def personToEmployee(p: Person): Employee = ???