给定一个函数 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
首先。
最佳答案
在编译时验证的情况下,您尝试做的事情不会在 Scala 中发生。这里的问题正是你所阐述的,你没有你试图提前构建的 case class
的定义。该定义提供了使用 Record
类型构造同构的脚手架。
就是说,我们也许可以通过调用动态和反射来处理一些事情,但我不清楚您甚至如何在代码中利用它。您不会事先知道字段名称或它们的类型。那么您将如何围绕它们编写代码?
关于scala - 从 Map[String, Type] 生成案例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536712/