Я пытаюсь составить Enumeratee.grouped
и Enumeratee.filter
, чтобы создать новый enumeratee, однако я столкнулся с проблемой отклонения. Типы ввода и вывода моего enumeratee являются ADT, и я получаю следующую ошибку.trait Enumeratee является инвариантным по типу From when using ADT
<console>:24: error: type mismatch;
found : play.api.libs.iteratee.Enumeratee[OutputType,OutputType]
required: play.api.libs.iteratee.Enumeratee[Product with Serializable with OutputType,OutputType]
Note: OutputType >: Product with Serializable with OutputType, but trait Enumeratee is invariant in type From.
You may wish to define From as -From instead. (SLS 4.5)
я воссоздал мою проблему с меньшим, например здесь (я понимаю, этот пример может быть переписан как Enumeratee.collect
однако, если не существует способ сочетать Enumeratee.grouped
и Enumeratee.filter
это мне не поможет.)
import play.api.libs.iteratee.Enumeratee
import scala.concurrent.ExecutionContext.Implicits.global
sealed abstract class InputType
case class InputA(counter: Int) extends InputType
case object InputB extends InputType
sealed abstract class OutputType
case class OutputA(msg: String) extends OutputType
case object OutputB extends OutputType
val e: Enumeratee[InputType, OutputType] = Enumeratee.map[InputType] {
case InputA(counter) => OutputA(counter.toString)
case InputB => OutputB
} compose Enumeratee.filter[OutputType] {
case OutputA("4") => false
case _ => true
}
Я не могу переопределить From
типа на Enumeratee быть -From
как ошибка компилятора предполагает, потому что это библиотека игры. Это ограничение библиотеки, которое вы не можете использовать ADT при составлении перечислений? Или есть лучший подход для этого варианта использования (поместите ClassTag
где-нибудь, напишите эту функцию другим способом и т. Д.)?