Shapeless:试图通过类型限制 HList 元素

Shapeless: Trying to restrict HList elements by their type

问题 1 - 基本 LUBConstraints

我第一次尝试使用现有的 LUBConstraints 由于缺少证据而失败(参见下面的代码块)。任何提示为什么?空列表不是有效的多头列表吗?没有元素违反约束。

import shapeless.ops.coproduct
import shapeless.{::, :+:, Coproduct, HNil, HList}

object testLUBConstraints {
  import shapeless.LUBConstraint._

  // !!! see comment on question - this satisfies the implicit below!!! 
  // implicit val hnilLUBForLong = new LUBConstraint[HNil.type, Long] {}

  def acceptLong[L <: HList : <<:[Long]#λ](l: L) = true
  val validLong = acceptLong(1l :: HNil)

  val validEmpty = acceptLong(HNil)
  //  => WHY??? Error: could not find implicit value for evidence parameter of type shapeless.LUBConstraint[shapeless.HNil.type,Long]
  //  MY EXPECTATION WAS: 'implicit def hnilLUB[T] = new LUBConstraint[HNil, T] {}' defined within LUBConstraint companion should provide so

  // val invalid = acceptLong(1.0d :: HNil) -> fails due to missing evidence (as expected)
}

感谢任何帮助。

问题 2 - 使用余积的自身约束 (拆分成一个单独的问题:

问题 3 - 按参数类型限制大小写 类 (分成一个单独的问题:Shapeless: restricting case class types

HNil 的推断类型将是单例类型 HNil.type,它是 HNil 的适当子类型。因为像 LUBConstraint 这样的类型 类 是不变的,所以如果您要求 HNil.type.

的实例,则不会找到 HNil 的任何可用实例

已经 some discussion 更改了 HNil 的定义,因此这会起作用,但这并非微不足道,而且尚不清楚更改的所有含义是否都是可取的。在此期间,您可以编写 HNil: HNil 来向上转换该值。