找不到参数 lgen 的隐式值:shapeless.LabelledGeneric.Aux
Could not find implicit value for parameter lgen: shapeless.LabelledGeneric.Aux
我是 Shapeless 的新手。我有一个助手 class,它利用无形 'Automatic Typeclass Derivation' (https://gist.github.com/negator/fbbcd1b2ce9a85b762b7) 来帮助我填充 json 读写。
import play.api.libs._
import json._
import shapeless.{ `::` => :#:, _ }
import poly._
object SReads extends LabelledTypeClassCompanion[Reads] {
object typeClass extends LabelledTypeClass[Reads] {
def emptyProduct: Reads[HNil] = Reads(_ => JsSuccess(HNil))
def product[F, T <: HList](name: String, FHead: Reads[F], FTail: Reads[T]) = Reads[F :#: T] {
case obj @ JsObject(fields) =>
for {
head <- FHead.reads(obj \ name)
tail <- FTail.reads(obj - name)
} yield head :: tail
case _ => JsError("Json object required")
}
def project[F, G](instance: => Reads[G], to: F => G, from: G => F) = Reads[F](instance.map(from).reads)
def emptyCoproduct: Reads[CNil] = Reads[CNil](_ => JsError("CNil object not available"))
def coproduct[L, R <: Coproduct](
name: String,
cl: => Reads[L],
cr: => Reads[R]) = Reads[L :+: R]{ js =>
js match {
case js @ JsString(n) if n == name => cl.reads(js).map(Inl.apply)
case js @ _ => cr.reads(js).map(Inr.apply)
}
}
}
}
我是这样使用的:
case class TrialMember(
@Key("_id") var id: String,
var weeks: String,
var `type`: Option[String] = Some("email"),
var updatedDate: Date = DateTime.now.toDate
)
object TrialMemberDao extends ModelCompanion[TrialMember, String] {
def collection = mongoCollection("trial_member")
val dao = new SalatDAO[TrialMember, String](collection) {}
def emails() = dao.find(MongoDBObject("type" -> "email")).toList.map(_.id)
def domains() = dao.find(MongoDBObject("type" -> "domain")).toList.map(_.id)
def isTrialMember(userEmail: String): Boolean = {
val trialMembers = emails() // whitelisted emails
val trialDomains = domains() // whitelisted domains
trialMembers.contains(userEmail) ||
trialDomains.filter(userEmail.contains(_)).headOption.isDefined
}
}
object TrialMember {
implicit val jsonWrites: Writes[TrialMember] = SWrites.deriveInstance
implicit val jsonReads: Reads[TrialMember] = SReads.deriveInstance
}
但是在升级到 sbt 0.13.8 和 Play 2.4 之后,现在它给我这个错误:
could not find implicit value for parameter lgen: shapeless.LabelledGeneric.Aux[T,LKV]
[error] implicit val reads: Reads[TrialMember] = SReads.deriveInstance
麻烦有点可笑,您的类型类派生器已完美实现,而编译器找不到 Option[String]
的 Reads
实例,而 type
字段应使用该实例。只需为您的代码提供如下定义:
object optionFormats {
def noneReads[T]: Reads[Option[T]] = Reads(Function.const(JsSuccess(None)))
implicit def optFormat[T](implicit w: Writes[T], r: Reads[T]) =
Format[Option[T]](
r.map[Option[T]](Some(_)).orElse(noneReads),
Writes(_.fold[JsValue](JsNull)(w.writes)))
}
然后在任何代码中
import optionFormats._
并且您的实例应该按需要构建。
我是 Shapeless 的新手。我有一个助手 class,它利用无形 'Automatic Typeclass Derivation' (https://gist.github.com/negator/fbbcd1b2ce9a85b762b7) 来帮助我填充 json 读写。
import play.api.libs._
import json._
import shapeless.{ `::` => :#:, _ }
import poly._
object SReads extends LabelledTypeClassCompanion[Reads] {
object typeClass extends LabelledTypeClass[Reads] {
def emptyProduct: Reads[HNil] = Reads(_ => JsSuccess(HNil))
def product[F, T <: HList](name: String, FHead: Reads[F], FTail: Reads[T]) = Reads[F :#: T] {
case obj @ JsObject(fields) =>
for {
head <- FHead.reads(obj \ name)
tail <- FTail.reads(obj - name)
} yield head :: tail
case _ => JsError("Json object required")
}
def project[F, G](instance: => Reads[G], to: F => G, from: G => F) = Reads[F](instance.map(from).reads)
def emptyCoproduct: Reads[CNil] = Reads[CNil](_ => JsError("CNil object not available"))
def coproduct[L, R <: Coproduct](
name: String,
cl: => Reads[L],
cr: => Reads[R]) = Reads[L :+: R]{ js =>
js match {
case js @ JsString(n) if n == name => cl.reads(js).map(Inl.apply)
case js @ _ => cr.reads(js).map(Inr.apply)
}
}
}
}
我是这样使用的:
case class TrialMember(
@Key("_id") var id: String,
var weeks: String,
var `type`: Option[String] = Some("email"),
var updatedDate: Date = DateTime.now.toDate
)
object TrialMemberDao extends ModelCompanion[TrialMember, String] {
def collection = mongoCollection("trial_member")
val dao = new SalatDAO[TrialMember, String](collection) {}
def emails() = dao.find(MongoDBObject("type" -> "email")).toList.map(_.id)
def domains() = dao.find(MongoDBObject("type" -> "domain")).toList.map(_.id)
def isTrialMember(userEmail: String): Boolean = {
val trialMembers = emails() // whitelisted emails
val trialDomains = domains() // whitelisted domains
trialMembers.contains(userEmail) ||
trialDomains.filter(userEmail.contains(_)).headOption.isDefined
}
}
object TrialMember {
implicit val jsonWrites: Writes[TrialMember] = SWrites.deriveInstance
implicit val jsonReads: Reads[TrialMember] = SReads.deriveInstance
}
但是在升级到 sbt 0.13.8 和 Play 2.4 之后,现在它给我这个错误:
could not find implicit value for parameter lgen: shapeless.LabelledGeneric.Aux[T,LKV]
[error] implicit val reads: Reads[TrialMember] = SReads.deriveInstance
麻烦有点可笑,您的类型类派生器已完美实现,而编译器找不到 Option[String]
的 Reads
实例,而 type
字段应使用该实例。只需为您的代码提供如下定义:
object optionFormats {
def noneReads[T]: Reads[Option[T]] = Reads(Function.const(JsSuccess(None)))
implicit def optFormat[T](implicit w: Writes[T], r: Reads[T]) =
Format[Option[T]](
r.map[Option[T]](Some(_)).orElse(noneReads),
Writes(_.fold[JsValue](JsNull)(w.writes)))
}
然后在任何代码中
import optionFormats._
并且您的实例应该按需要构建。