scala - 简单的 Shapeless HLIST 上的模式匹配

标签 scala shapeless

我使用 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.Predef进口 ::运算符(operator)来自 scala.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)
  }
}

关于scala - 简单的 Shapeless HLIST 上的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43440367/

相关文章:

scala - Scala 中的方法执行顺序不正确

java - Scala:加载 Java 属性

scala - 生成类型类实例时无法证明单例类型是单例类型

scala - HList.foldRight 在类型类的实现中使用时如何查找隐式?

scala - HList#foldLeft() 返回什么?

scala - reshape 案例类构造函数?

android - 如何防止为已回收的 View 生成不必要的工作线程?

scala - 如何增加 UUID 加特林馈线

Scalaz 和主要方法

scala - 如何使用 Shapeless 编写递归多态函数