使用无形的多态反序列化函数

时间:2013-10-06 21:21:29

标签: scala serialization shapeless

我正在尝试使用无形的hlists / csv编写多态反序列化函数

以下是提供序列化/反序列化的Value类型类的定义(我知道结果应该返回,并且Option / Either / Validation显示失败的解析,但稍后会出现)

class Value[T](val read: String => T, val write: T => String)

object Value {

   implicit object IntValue extends Value[Int](_.toInt, _.toString)

   implicit object StringValue extends Value[String](s => s, s => s)

   def apply[V: Value] = implicitly[Value[V]]
}

import Value._

以下序列化功能效果很好

object serialize extends Poly1 {
   implicit def caseValue[T: Value] = at[T](Value[T].write)
}

并且我能够成功地将它映射到具有支持值[_]类型类的类型的HList:

def write[L <: HList, LA1 <: HList](t: L)(
  implicit mapper: Mapper.Aux[writePoly.type, L, LA1],
  lister: ToList[LA1, String]): List[String] = t.map(writePoly).toList

以下是我尝试过的反序列化函数的两个不同版本:

object deserialize extends Poly1 {
    implicit def caseValue[T: Value] = at[String](Value[T].read)
}

object deserialize extends Poly1 {
    implicit def caseStr = at[String](Value[String].read)

    implicit def caseInt = at[String](Value[Int].read)
}

我想最终在像这样的函数中使用它

def read[L <: HList, LI <: HList](t: LI)(
  implicit mapper: Mapper.Aux[readPoly.type, LI, L]): L = t.map(readPoly)

然而,当我尝试使用deserialize函数映射HList时,或者甚至当我尝试单独使用它时,如下所示:

deserialize("1")

编译器抱怨含糊不清的隐含值:

ambiguous implicit values:
 both method caseString in object deserialize of type => CsvFormat.deserialize.Case[String]{type Result = String}
 and method caseInt in object deserialize of type => CsvFormat.deserialize.Case[String]{type Result = Int}
 match expected type shapeless.poly.Case[CsvFormat.deserialize.type,shapeless.::[String,shapeless.HNil]]
    print(deserialize[String]("a"))
                             ^

我的目标是使用此函数映射具有值[_]类型的HList的字符串列表以序列化它们,但是因为即使在尝试应用“反序列化”函数时我也遇到了相同的错误一个字符串,我希望首先解决这个问题。

我很难提供额外的类型提示来引导编译器,因为scala不支持类型级别currying,我应该使用像lambda这样的类型吗?

有没有其他方法可以表达这种功能?

0 个答案:

没有答案