4

我正在尝试使用 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 类型的东西吗?

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

4

0 回答 0