Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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合并两个不同case类的字段_Scala_Shapeless - Fatal编程技术网

使用无形状scala合并两个不同case类的字段

使用无形状scala合并两个不同case类的字段,scala,shapeless,Scala,Shapeless,我想将两个不同案例类的字段合并到一个案例类中 例如,如果我有以下案例类: case class Test(name:String, questions:List[Question], date:DateTime) case class Answer(answers:List[Answers]) 我想要一种简洁的、不成形的方式将两者合并为: TestWithAnswers(name:String, questions:List[Question], date:DateTime, answers

我想将两个不同案例类的字段合并到一个案例类中

例如,如果我有以下案例类:

case class Test(name:String, questions:List[Question], date:DateTime)

case class Answer(answers:List[Answers])
我想要一种简洁的、不成形的方式将两者合并为:

TestWithAnswers(name:String, questions:List[Question], date:DateTime, answers:List[Answer]). 

有没有一个不成形的好答案

您可以使用无形状
通用
来执行此操作

val t: Test = ???
val a: Answer = ???
val gt = Generic[Test]
val ga = Generic[Answer]
val gta = Generic[TestWithAnswers]

val ta = gta.from(gt.to(t) ++ ga.to(a))
或者,如果你有一件事的话

val ta = Generic[TestWithAnswers].from(Generic[Test].to(t) ++ Generic[Answer].to(a))
如果
t
Test
的实例,
a
Answer
的实例,
ta
将是
TestWithAnswers
的实例

快速解释:
Generic
可以将案例类转换为Generic
HList
表示,也可以将案例类转换为Generic
HList表示。因此,根据类的结构,您可以简单地将test和answer转换为hlist,将两个列表连接成一个列表,并从中构建一个
TestWithAnswers
实例

下面是一个简单的示例,您可以复制粘贴并在REPL中尝试

import shapeless._
case class A(a: Int)
case class B(a: String)
case class AB(a: Int, b: String)
Generic[AB].from(Generic[A].to(A(42)) ++ Generic[B].to(B("foo")))
// AB(42, "foo")

你是说val ta=gta.from(gt.to(t)+at.to(a))而不是val ta=gta.from(gt.to(t)+gt.to(a))?即使我做了更改,代码仍然无法编译。看起来,++运算符不是gt.to(t)的成员。有什么想法吗?谢谢你对泛型的解释。非常有用。@azuras,是的,拼写错误已经纠正了。你把所有不成形的东西都导入了吗?我在repl中运行了代码,它成功了是的,你肯定是对的。Intellij显示了一个错误,但repl将其显示为正确!谢谢你的帮助。非常好的解决方案如果我们想得到这样的解决方案
TestWithAnswers(名称:String,问题:List[Question],答案:List[Answer])
。我们怎么办?