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

我正在尝试实现第15章Scala函数编程中描述的流传感器。 作者不对过程类型参数
过程[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]