我正在尝试使用无形的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这样的类型吗?
有没有其他方法可以表达这种功能?