【发布时间】:2015-04-15 14:33:32
【问题描述】:
我有一个密封的特征/抽象类层次结构,需要将其子类型转换为字符串,然后将这些字符串转换回类型。此代码示例描述了我想要实现的目标:
import shapeless._
object Test extends App {
sealed abstract class C(val i: Int)
case object O1 extends C(1)
case object O2 extends C(2)
// lots of other implementations
trait TC[A] {
def f: String
}
implicit object TC1 extends TC[O1.type] {
def f = "O1"
}
implicit object TC2 extends TC[O2.type] {
def f = "O2"
}
object fqn {
val o1 = implicitly[TC[O1.type]].f
val o2 = implicitly[TC[O2.type]].f
def asString(c: C): String = c match {
case O1 ⇒ o1
case O2 ⇒ o2
}
def fromString(s: String): C = s match {
case `o1` ⇒ O1
case `o2` ⇒ O2
}
}
object asString extends Poly1 {
private implicit def impl[A <: C : TC] = at[A](a ⇒ implicitly[TC[A]].f)
def apply(c: C): String = Generic[C].to(c).map(this).unify
}
object fromString {
def apply(s: String): C = ???
}
// This works as expected
println(O1 eq fqn.fromString(fqn.asString(O1)))
println(O2 eq fqn.fromString(fqn.asString(O2)))
// Does not yet work
println(O1 eq fromString(asString(O1)))
println(O2 eq fromString(asString(O2)))
}
目前,fqn 中的功能一切正常,但对于C 的更多子类型,它很麻烦且难以维护。使用 shapeless 我设法摆脱了 asString 部分,但我一直在为 fromString 部分寻找解决方案。
谁能想到在 shapeless(或其他库)中实现fromString 部分的方法?
关于我的示例的更多详细信息:
-
TC由图书馆提供,我无法更改。类型类是 由该库中的宏生成,因此 TCN 类型类 不直接存在。 - 我不能轻易提供一个宏来生成
fqn.asString和fqn.fromString的实现,因此我正在寻找一个已经支持这种行为的库。
【问题讨论】: