加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 将无可拉伸的可扩展记录传递给函数

发布时间:2020-12-16 09:35:40 所属栏目:安全 来源:网络整理
导读:我正在尝试学习Shapeless(使用版本2.10.2)。我创建了一个非常简单的可扩展记录: val rec1 =(“foo”→ 42):: HNil 根据REPL,这种类型 shapeless.::[Int with shapeless.record.KeyTag [String(“foo”),Int],shapeless.HNil] 我试图定义一个简单的函数:
我正在尝试学习Shapeless(使用版本2.10.2)。我创建了一个非常简单的可扩展记录:

val rec1 =(“foo”→>> 42):: HNil

根据REPL,这种类型

shapeless.::[Int with shapeless.record.KeyTag [String(“foo”),Int],shapeless.HNil]

我试图定义一个简单的函数:

def fun(x: ::[Int with KeyTag[String("foo"),Int],HNil]) = x("foo")

但它甚至不编译。我不能在类型声明中使用String(“foo”),并获得错误。

我有两个问题:

>如何在我的代码中指定可扩展记录的类型?
>当处理具有更多字段的记录时,类型声明的长度和复杂性将无法管理。有没有办法为类型创建一个别名,给定一个特定的记录实例或其他解决方法?

编辑

我发现:

val rec1 = ("foo" ->> 42) :: HNil
val rec2 = ("foo" ->> 43) :: HNil
var x = rec1
x = rec2

效果很好。我总结rec1,rec2和x是相同的类型。我只是不知道如何在代码中表达那种类型!

解决方法

这里有一些更一般的东西,我认为可以回答你的问题。假设我们要编写一个可以使用“foo”键在任何记录上工作的方法。我们可以使用证人和选择器的组合:

import shapeless._,record._,syntax.singleton._

val w = Witness("foo")

def fun[L <: HList](xs: L)(implicit sel: ops.record.Selector[L,w.T]) = xs("foo")

接着:

scala> fun(("foo" ->> 42) :: HNil)
res0: Int = 42

要么:

scala> fun(("bar" ->> 'a) :: ("foo" ->> 42) :: HNil)
res1: Int = 42

如果我们真的只想允许没有其他字段的记录,我们可以写下列内容:

def fun(l: Int with KeyTag[w.T,Int] :: HNil) = l("foo")

但这与记录通常使用的方式有些不一致。

我们必须定义证人,正是因为Scala 2.10不提供任何方式直接提及单身人士,例如参见Alois Cochard的Shona项目my fork项目进行一些讨论。

我会添加一个最后的免责声明,我只是刚刚熟悉Shapeless 2.0自己,但我不认为即使Miles是魔法足以克服这个限制。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读