特性Enumeratee在使用ADT时在类型From中是不变的

时间:2015-08-19 15:13:28

标签: scala playframework iterate

我正在尝试撰写Enumeratee.groupedEnumeratee.filter来制作新的枚举,但我遇到了差异问题。我的枚举器的输入和输出类型是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.groupedEnumeratee.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
}

我无法将Enumeratee上的From类型重新定义为编译器错误建议的-From,因为它是一个播放库。在编写枚举数时,您是否无法使用ADT限制库?或者这个用例是否有更好的方法(在某处放置ClassTag,用另一种方式写这个功能等等)?

1 个答案:

答案 0 :(得分:0)

我找到了一个似乎没问题的解决方案。如果您将Enumeratee.map[InputType]更改为Enumeratee.map[InputType].apply[OutputType],则推理器将获得不变类型,并且编译得很好。

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