2015-08-19 1 views
0

Я пытаюсь составить 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 где-нибудь, напишите эту функцию другим способом и т. Д.)?

ответ

0

Я нашел решение, которое выглядит нормально. Если вы меняете Enumeratee.map[InputType] на Enumeratee.map[InputType].apply[OutputType], inferencer получает тип инварианта и компилируется просто отлично.

val e: Enumeratee[InputType, OutputType] = Enumeratee.map[InputType].apply[OutputType] { 
    case InputA(counter) => OutputA(counter.toString) 
    case InputB => OutputB 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^