问题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-使用副产品的自身约束
(分为一个单独的问题:Shapeless: own HList constraint using Coproduct)

问题3-通过参数类型限制案例类
(分为分离问题:Shapeless: restricting case class types)

最佳答案

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

some discussion更改了HNil的定义,以便可以正常工作,但这并不是一件容易的事,而且尚不清楚更改的所有含义是否合乎需要。同时,您可以编写HNil: HNil上载该值。

09-11 18:38