给定函数f
,给定Map[String, MyType]
,返回HList
:
package net
import shapeless._
sealed trait MyType
case object MyInt extends MyType
case object MyStr extends MyType
object Mapper {
def f(m: Map[String, MyType]): HList = m.foldLeft[HList](HNil){ (acc, elem) =>
val (key, t) = elem
t match {
case MyInt => classOf[Int] :: acc
case MyStr => classOf[String] :: acc
}
}
}
我测试了它:
import net._
val list = Map("foo" -> MyInt, "bar" -> MyStr)
scala> Mapper.f(list)
res0: shapeless.HList = class java.lang.String :: int :: HNil
如何使用上述方法(或其他方法)构建case class
,其成员与String
键匹配,以及f
输出所给出的类型?
所以,我正在寻找:
g(Map("foo" -> MyInt, "bar" -> MyStr))
输出case class X(foo: Int, bar: String)
,其中X
是任意选择的,即此时不重要。
我想过使用Generic[X]
,但我不知道如何在没有Generic
的情况下获得case class
。
答案 0 :(得分:2)
您尝试做的事情可以通过编译时验证在Scala中发生。这里的问题正如您所阐述的那样,您没有预先确定case class
您尝试构建的定义。该定义提供了脚手架使用Record
类型来构造同构。
也就是说,我们可能能够通过调用动态和反射来工作,但我还不清楚你如何在代码中利用它。你不会事先知道字段名称,也不知道它们的类型。那你怎么用它们编写代码呢?