简单无形 HLIST 上的模式匹配

Pattern matching on a simple Shapeless HLIST

我使用 shapeless 库编写了这个简单的代码

import shapeless.LabelledGeneric
case class Icecream(name: String, numberOfCherries: Int, inCone: Boolean)

object ShapelessRecordEx2 extends App {
   val gen = LabelledGeneric[Icecream]
   val hlist = gen.to(Icecream("vanilla", 2, false))
   hlist match {
      case h :: _ => println(h)
   }
}

但甚至无法编译

Error:(12, 14) constructor cannot be instantiated to expected type;
 found   : scala.collection.immutable.::[B]
 required: shapeless.::[String with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("name")],String],shapeless.::[Int with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("numberOfCherries")],Int],shapeless.::[Boolean with shapeless.labelled.KeyTag[Symbol with shapeless.tag.Tagged[String("inCone")],Boolean],shapeless.HNil]]]
      case h :: _ => println(h)

如果我使用的是普通列表,这段代码就没问题。

您只需要导入,默认情况下 scala.Predefscala.collection.immutable.List 导入 :: 运算符。

import shapeless.LabelledGeneric
import shapeless.::
case class Icecream(name: String, numberOfCherries: Int, inCone: Boolean)

object ShapelessRecordEx2 extends App {
   val gen = LabelledGeneric[Icecream]
   val hlist = gen.to(Icecream("vanilla", 2, false))
   hlist match {
      case h :: _ => println(h)
   }
}

还有一个选项,可以导入 ListCompat._

import shapeless.HList.ListCompat._

object ShapelessRecordEx2 extends App {
  val gen = LabelledGeneric[Icecream]
  val hlist = gen.to(Icecream("vanilla", 2, false))
  hlist match {
    case h #: _ => println(h)
  }
}