我正在尝试使用 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)
}
并且我能够成功地将它映射到具有支持 Value[_] 类型类的类型的 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
以下是我尝试过的 2 个不同版本的反序列化函数:
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)
但是,当我尝试使用反序列化函数映射 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 不支持类型级别的柯里化,我应该使用类似 lambda 类型的东西吗?
有没有其他方法可以表达这种类型的功能?