相关疑难解决方法(0)

将无形可扩展记录传递给函数

我正在尝试学习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")
Run Code Online (Sandbox Code Playgroud)

但它甚至没有编译.我不能在类型声明中使用String("foo"),并得到错误.

我有两个问题:

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

编辑

我发现:

val rec1 = ("foo" ->> 42) :: HNil
val rec2 = ("foo" ->> 43) :: HNil
var x = rec1
x = rec2
Run Code Online (Sandbox Code Playgroud)

效果很好.我得出结论rec1,rec2和x属于同一类型.我只是不知道如何在代码中表达该类型!

scala shapeless

18
推荐指数
2
解决办法
2255
查看次数

将无形可扩展记录传递给函数(续)

考虑到这个问题:将无形可扩展记录传递给函数,Travis的答案显示,将可扩展记录作为参数的每个函数都必须具有隐式选择器作为参数.我想知道如果我们有很多这样的功能,是否可以将这些声明分解.例如:

val w1 = Witness("foo1")
val w2 = Witness("foo2")
val w3 = Witness("foo3")
//Here some "magical" declarations avoiding to declara selectors in fun1, fun2, fun3 below

 def fun1[L <: HList](xs: L) = ... //Access to foo1, foo2, foo3
 def fun2[L <: HList](xs: L) = ... //Access to foo1, foo2, foo3
 def fun3[L <: HList](xs: L) = ... //Access to foo1, foo2, foo3
Run Code Online (Sandbox Code Playgroud)

谢谢

伯努瓦

编辑12月10日

在尝试答案的代码时,会出现两个问题:

  1. 没有告知关于与foo1,foo2,foo3相关的数据的真实类型:因此,像fun1这样的函数不能使用与这些类型相关联的任何方法.例如,即使foo3是Double,它也不能采用它的平方根.
  2. 如果我有打电话( "foo1" - >> "你好")FUN1 ::( "foo2的" - > 1)::( "foo3" …

scala shapeless

8
推荐指数
1
解决办法
1388
查看次数

将无形的可扩展记录传递给函数(永无止境的故事?

我继续研究可扩展记录,如将无形可扩展记录传递给函数(续):提供的解决方案适用于所有参数都包含至少foo1,foo2和foo3的参数; 这可以写:

fun1(("foo1" ->> "hello") :: ("foo2" ->> 1) :: ("foo3" ->> 1.2) :: HNil)
fun1(("foo1" ->> "hello") :: ("foo2" ->> 1) :: ("foo3" ->> 1.2) :: ("foo4" ->> true) :: HNil)
Run Code Online (Sandbox Code Playgroud)

等等

如果我们可以添加第二个函数fun2:

def fun2[L <: HList : HasMyFields](xs: L) = {
  val selectors = implicitly[HasMyFields[L]]
  import selectors._
  xs("foo1").length + xs("foo2") + xs("foo3")
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

现在,我们假设我们有一组字段foo1,foo2,...和一组函数fun1,fun2,它们将{foo1,foo2,...}的任何子集组成的记录作为参数.例如,fun1可以将包含foo1和foo3的记录作为参数,但不一定是foo2,fun2会期望至少包含foo4的记录,依此类推.

有没有办法避免声明像HasMyFields这样多的类,因为它们是可能的组合(如果我们有n个字段,则有2**个组合!)?

scala shapeless

6
推荐指数
1
解决办法
607
查看次数

标签 统计

scala ×3

shapeless ×3