【发布时间】:2014-09-30 22:23:43
【问题描述】:
有一种类型可以通过特定的一组受限类型进行参数化:
trait Base[T] { def f(t: T): List[T] }
implicit object StringBase extends Base[String] {
override def f(t: String) = t.toList.map(c => String.valueOf(c))
}
implicit object IntBase extends Base[Int] {
override def f(t: Int) = List(t,t,t)
}
现在,我可以定义一个函数来获取特定类型的集合并对其进行处理:
def consume[T : Base](xs: Seq[T]) =
xs.map(x => implicitly[Base[T]].f(x).mkString("-"))
如何定义一个函数,该函数采用一系列对象,这些对象的类型存在到Base 的隐式转换并执行相同操作?当然是以类型安全的方式。
如果我不完全清楚,这就是我想要的:
consume(Seq(1,"asd", 3)) // => Seq("1-1-1", "a-s-d", "3-3-3")
我确信我可以通过 shapeless'HList 实现它,但是核心 Scala 呢?无论如何,把shapeless标签放在功能倾向的人愿意提供帮助的情况下。
【问题讨论】:
-
问题在于推断的序列类型将是元素类型的最小上限(在本例中为
Any)。您可以使用HList编写它,或者您可以使用运行时反射来做一些糟糕的事情,但是如果您想要核心 Scala 和类型安全,那么不幸的是您不走运。 -
@TravisBrown,这就是我害怕的。我知道这是对我的问题的最终答案,所以也许你应该在下面发布,以便我可以将问题标记为已关闭。
标签: scala types typeclass shapeless