关于HLists的易读文档非常少,我在SO上找到的答案对于一个Scala初学者来说太过复杂。
我遇到了HLists是因为Slick可以自动生成一些用于表示数据库行的HLists。它们是slick.collection.heterogeneous.HList
(不是shapeless')。例如:
type MyRow = HCons[Int,HCons[String,HCons[Option[String],HCons[Int,HCons[String,HCons[Int,HCons[Int,HCons[Option[Int],HCons[Option[Float],HCons[Option[Float],HCons[Option[String],HCons[Option[String],HCons[Boolean,HCons[Option[String],HCons[Option[String],HCons[Option[String],HCons[Option[String],HCons[Option[String],HCons[Option[Int],HCons[Option[Float],HCons[Option[Float],HCons[Option[Float],HCons[Option[String],HCons[Option[String],HNil]]]]]]]]]]]]]]]]]]]]]]]]
def MyRow(a, b, c, ...): MyRow = a :: b :: c :: ... :: HNil
现在,如果给定其中的一行,我需要读取一个元素,并尽可能地进行类型转换。但我无法做到这一点。我已经尝试过了。
row(4) // error
row._4 // error
row.toList // elements are inferred as Any
row match { case a :: b :: c :: x :: rest => x } // "Pattern type is incompatible. Expected MyRow."
row match { case MyRow(_,_,_,_,_,x,...) => x } // is not a case class like other rows
row match { HCons[Int,HCons[String,HCons[Option[String],HCons[Int,HCons[String, x]]]]] => x.head } // error
row.tail.tail.tail.tail.head // well, is that really the way??
请问如何从那个“恐龙”中提取特定值?
HList
非常害怕,就像面对恐龙一样。 - sarveshseri