Frage 1 zu beschränken - Grund LUBConstraintsShapeless: Der Versuch, hList Elemente durch ihre Art
Mein erster Versuch des Spiel mit bestehenden LUBConstraints nicht für fehlende Beweise (siehe Codeblock unten). Irgendein Hinweis warum? Ist eine leere Liste keine gültige Liste von Longs? Kein Element verletzt die Einschränkung.
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)
}
Jede Hilfe wird geschätzt.
Frage 2 - Eigene Constraint mit coproduct (aufgeteilt in eine separate Frage: Shapeless: own HList constraint using Coproduct)
Frage 3 - beschränken Fallklassen von Parametertypen (aufgeteilt in eine separat Frage: Shapeless: restricting case class types)
ich es geschafft, um den ersten Fehler (in Codeblock von _Question 1_) durch lokal zu erhalten 'implizite val hnilLUBForLong erklärt = new LUBConstraint [HNil.type, Long] {}' - Es scheint, dass der implizite Wert von erklärtes bereitgestellt Methode stimmt nicht genau überein: 'LUBConstraint [HNil, Long] =! = LUBConstraint [HNil.type, Long]' Absicht oder gar ein Fehler? – sthielo
arbeitet an der impliziten Auflösung von CPConstraint (siehe _Question 2_) Hat 'val hlLong: :: [Long, HNil] = 1L :: HNil' und sucht implizit nach einem CPConstraint dafür mit 'implizit val cpcLong = implizit [CPConstraint] hlLong.type, CPType]] 'Ich habe versucht' implizit val scpcEmptyLong1: CPConstraint [:: [Lang, HNil], CPType] = new CPConstraint [:: [Long, HNil], CPType] {} ', was ** NICHT tut ** passe das implizite gesuchte aber 'implizite val scpcEmptyLong2: CPConstraint [hlLong.type, CPType] = new CPConstraint [hlLong.type, CPType] {}' würde. - WARUM??? Was ist der Unterschied? – sthielo
Dies sollte wahrscheinlich drei separate Fragen sein. Im ersten Fall können Sie das Problem beheben, indem Sie 'HNil' explizit als' HNil' eingeben: 'acceptLong (HNil: HNil)' sollte kompiliert werden. –