Scala 具有逆变输入参数编译错误的流处理器的过滤函数
我正在尝试实现第15章Scala函数编程中描述的流传感器。 作者不对过程类型参数Scala 具有逆变输入参数编译错误的流处理器的过滤函数,scala,generics,covariance,contravariance,Scala,Generics,Covariance,Contravariance,我正在尝试实现第15章Scala函数编程中描述的流传感器。 作者不对过程类型参数过程[I,O]使用方差。然而,为了真正理解差异,我在类型参数中添加了差异:Process[-I,+O]。 一切都很顺利,直到我尝试实现filter函数并出现以下编译错误: 逆变型I出现在I型的协变位置=>p值的布尔值 这是我一直使用的设置代码: sealed trait Process[-I, +O] { self => import Process._ def apply(s: Strea
过程[I,O]
使用方差。然而,为了真正理解差异,我在类型参数中添加了差异:Process[-I,+O]
。
一切都很顺利,直到我尝试实现filter
函数并出现以下编译错误:
逆变型I出现在I型的协变位置=>p值的布尔值
这是我一直使用的设置代码:
sealed trait Process[-I, +O] { self =>
import Process._
def apply(s: Stream[I]): Stream[O] = this match {
case Halt => Stream()
case Await(recv) =>
s match {
case h #:: t => recv(Some(h))(t)
case xs => recv(None)(xs)
}
case Emit(h, t) => h #:: t(s)
}
def filter(p: I => Boolean): Process[I, O] = self match {
case Halt => Halt
case Await(recv) =>
Await {
case Some(i) if (p(i)) => recv(Some(i))
case _ => recv(None)
}
case Emit(head, tail) => Emit(head, tail.filter(p))
}
}
object Process {
case class Emit[I, O](
head: O,
tail: Process[I, O] = Halt
) extends Process[I, O]
case class Await[I, O](
recv: Option[I] => Process[I, O]
) extends Process[I, O]
case object Halt extends Process[Any, Nothing]
}
我已尝试将过滤器
签名修改为:
def过滤器[II>:I](p:I=>Boolean):进程[II,O]
还尝试更改wait
以具有以下类型参数:
case class Await[I, O, II >: I](
recv: Option[I] => Process[II, O]
) extends Process[I, O]
但是仍然没有编译出这段代码
有什么想法吗?试试看
def filter[II <: I](p: II => Boolean): Process[II, O] = ...
def filter[II Boolean):进程[II,O]=。。。
使用原始的
Await
是的,这很有效。我想我尝试了这个签名,但是使用Await
具有recv:Option[I]=>进程[II,O]