Question 1 - Basic LUBConstraints
My first try playing around with existing LUBConstraints fails for missing evidence (see code block below). Any hint why? Isn't an empty list a valid list of longs? no element violates the constraint.
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)
}
Any help appreciated.
Question 2 - Own Constraint using Coproduct (split into a seperate question: Shapeless: own HList constraint using Coproduct)
Question 3 - restrict case classes by parameter types (split into a separat question: Shapeless: restricting case class types)
implicit val hnilLUBForLong = new LUBConstraint[HNil.type, Long] {}
- It seems that the implicit value provided by the declared method doesn't exactly type match:LUBConstraint[HNil, Long] =!= LUBConstraint[HNil.type, Long]
Intention or even a bug? – Protectionismval hlLong: ::[Long, HNil] = 1L :: HNil
and implicitly looking up a CPConstraint for it withimplicit val cpcLong = implicitly[CPConstraint[hlLong.type, CPType]]
I triedimplicit val scpcEmptyLong1: CPConstraint[::[Long,HNil], CPType] = new CPConstraint[::[Long,HNil], CPType] {}
, which does NOT fit the implicit searched butimplicit val scpcEmptyLong2: CPConstraint[hlLong.type, CPType] = new CPConstraint[hlLong.type, CPType] {}
would. - WHY??? What's the difference? – ProtectionismHNil
asHNil
:acceptLong(HNil: HNil)
should compile. – Steffiimplicit def hnilLUB[HN <: HNil, T] = new LUBConstraint[HN, T] {}
- would this be worth a proposal for improvement? – Protectionism