scala - HList 中的类型类包含元素?

标签 scala shapeless

我正在尝试定义一个类型类,使 HList L 包含特定类型 A

trait Contains[A] {
  type Out
}
object Contains {

  type Aux[A, O] = Contains[A] { type Out = O }

  def contains[L <: HList, A]
       (implicit ev: Contains.Aux[L, A]) = ev

  implicit def containsInt[H, L <: HList, A]
       (implicit ev: H == A): Contains.Aux[H :: L, A] =
    new Contains[H :: L] {
      type Out = A
    }
}

当然,由于 ev: H == A,它无法编译。

这样的“等价类型”类型类是否存在?

一旦成功,我希望编译以下内容:

隐式地[Contains.Aux[Int::HNil, Int]] 因为在 HList 中有一个 Int

然而,我希望隐式地[Contains.Aux[String::HNil, Boolean]不会编译,因为输入 HList 中没有Boolean

最佳答案

您正在寻找 shapeless.ops.hlist.Selector

使用 Selector,您的示例将像这样运行,

scala> import shapeless._, ops.hlist._
import shapeless._
import ops.hlist._

scala> Selector[Char :: HNil, Char]
res0: shapeless.ops.hlist.Selector[shapeless.::[Char,shapeless.HNil],Char] = shapeless.ops.hlist$Selector$$anon$37@20eebe9c

scala> Selector[Int :: Char :: HNil, Char]
res1: shapeless.ops.hlist.Selector[shapeless.::[Int,shapeless.::[Char,shapeless.HNil]],Char] = shapeless.ops.hlist$Selector$$anon$38@10cf3c87

scala> Selector[Int :: HNil, Int]
res2: shapeless.ops.hlist.Selector[shapeless.::[Int,shapeless.HNil],Int] = shapeless.ops.hlist$Selector$$anon$37@79d8c266

scala> Selector[Boolean :: Char :: HNil, Int]
<console>:18: error: Implicit not found: shapeless.Ops.Selector[shapeless.::[Boolean,shapeless.::[Char,shapeless.HNil]], Int]. You requested an element of type Int, but there is none in the HList shapeless.::[Boolean,shapeless.::[Char,shapeless.HNil]].
       Selector[Boolean :: Char :: HNil, Int]
               ^

scala> Selector[Boolean :: Char :: HNil, Char]
res4: shapeless.ops.hlist.Selector[shapeless.::[Boolean,shapeless.::[Char,shapeless.HNil]],Char] = shapeless.ops.hlist$Selector$$anon$38@bf88c94

scala> Selector[Boolean :: Int :: Char :: HNil, Char]
res5: shapeless.ops.hlist.Selector[shapeless.::[Boolean,shapeless.::[Int,shapeless.::[Char,shapeless.HNil]]],Char] = shapeless.ops.hlist$Selector$$anon$38@653f47f

scala> Selector[Int :: HNil, HNil]
<console>:18: error: Implicit not found: shapeless.Ops.Selector[shapeless.::[Int,shapeless.HNil], shapeless.HNil]. You requested an element of type shapeless.HNil, but there is none in the HList shapeless.::[Int,shapeless.HNil].
       Selector[Int :: HNil, HNil]
               ^

关于scala - HList 中的类型类包含元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42043306/

相关文章:

scala - 隐式<:<如何帮助查找类型参数

scala - 过滤案例类对象属性的最佳实践

spring - 如何让 Spring 连接我的 JmsComponent

postgresql - 在 slick, scala 中处理 Postgres json 数据类型

scala - 使用隐式查找List类型类的 "One"元素注入(inject)

scala - 如何将通用 HList 转换为列表

mongodb - 标记为 Generic 包含 `$eq`

scala - Spark - scala - 如何检查配置单元中是否存在表

scala - N-Tuple of Options to Option of N-Tuple

scala - "Distributive property"与无形