gpt4 book ai didi

scala - 将 Sized[Something[String], _] 集合转换为 HList

转载 作者:行者123 更新时间:2023-12-05 00:21:43 24 4
gpt4 key购买 nike

我是无形的新手,并试图通过实践来学习它。我想制作一个非常小的库,它可以将 String 的集合(第一步是 Sized 集合)转换为不同类型的 HList。

基本上我想要实现的目标:

import shapeless._
import nat._
import BigQueryParser._

val s: Sized[IndexedSeq[String], nat._3] = Sized("Testing", "2.0", "1")

BigQueryParser[Sized[IndexedSeq[String], nat._3], String :: BigDecimal :: BigInt :: HNil].parse(s)

我的非工作实现在这里 https://gist.github.com/taojang/f6a9352dbc618039e3a3

我是在 https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapeless/examples/csv.scala 之后实现的

我的代码无法编译,编译器提示以下错误:
[error] /somepath/some-file.scala: could not find implicit value for parameter st: exmaple.BigQueryParser[shapeless.Sized[IndexedSeq[String],shapeless.nat._3],shapeless.::[String,shapeless.::[BigDecimal,shapeless.::[BigInt,shapeless.HNil]]]]
[error] BigQueryParser[Sized[IndexedSeq[String], nat._3], String :: BigDecimal :: BigInt :: HNil].parse(s)

最佳答案

我发现调试此类问题的最佳方法是尝试手动构建实例。例如,这很好:

scala> BigQueryParser[Sized[IndexedSeq[String], _0], HNil]
res0: BigQueryParser[shapeless.Sized[IndexedSeq[String],shapeless.nat._0],shapeless.HNil] = BigQueryParser$$anon$6@2f4cd46d

但这打破了:
scala> deriveHCons[IndexedSeq[String], _0, String, HNil]
<console>:31: error: could not find implicit value for parameter conv: BigQueryParser[scala.collection.generic.IsTraversableLike[IndexedSeq[String]]#A,String]
deriveHCons[IndexedSeq[String], _0, String, HNil]
^

这表明 IsTraversableLike[Repr]#A 出了点问题类型投影。在这种情况下,我要做的第一件事是将其设为类型参数(在本例中为 ReprA),然后约束 IsTraversableLike[Repr]具有细化类型的实例:
implicit def deriveHCons[Repr, ReprA, L <: Nat, V, T <: HList](implicit
itl: IsTraversableLike[Repr] { type A = ReprA },
ev: AdditiveCollection[Repr],
ts: BigQueryParser[Sized[Repr, L], T],
conv: BigQueryParser[ReprA, V]
): BigQueryParser[Sized[Repr, Succ[L]], V :: T] =
new BigQueryParser[Sized[Repr, Succ[L]], V :: T] {
def parse(s: Sized[Repr, Succ[L]]): Try[V :: T] =
for {
h <- conv.parse(s.head)
t <- ts.parse(s.tail)
} yield h :: t
}

这工作得很好:
scala> println(
| BigQueryParser[
| Sized[IndexedSeq[String], nat._3],
| String :: BigDecimal :: BigInt :: HNil
| ].parse(s)
| )
Success(Testing :: 2.0 :: 1 :: HNil)

您可能还可以进行其他简化(例如,直接使用 _0 而不是 L <: _0 类型参数),但此修复程序至少应该使事情顺利进行。

关于scala - 将 Sized[Something[String], _] 集合转换为 HList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31139511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com