我正在尝试使用scalaz-stream创建一个循环过程,方法是将一个数据源与来自同一数据源的过滤版本合并。这是我到目前为止的一个简单例子:
val s1 = Process.emitAll(1 to 10).toSource
val w = wye.merge[Int]
val s2 = w.filter(_ < 5)
val w2 = s1.wye(s2)(w)
但它没有编译,因为s2
是Process[Process.Env[Int,Int]#Y,Int]
但需要是Process[Task,Int]
。
如何指定s2既是输入(s1
}又是w
的输出?
答案 0 :(得分:3)
我认为问题出在st2中,定义为用t2压缩wye(w)。这没有任何意义,因此Yye只是描述了如何合并这些过程。
我认为t2是Process [Task,Duration],所以你需要在左侧另一个Process [Task,Duration]然后你可以使用wye.merge [Duration]将它们合并在一起,如:
val t1: Process[Task,Duration] = ???
val t2: Process[Task,Duration] = Process.awakeEvery(3 second)
val st2: Process[Task.Duration] = t1.filter(_ < 5 seconds).zip(t2).map(_._1)
val w2: Process[Task.Duration] = t1.wye(st2)(wye.merge) //or simply t1.merge(t2)
也许在每一行上输入anotations都会引导你的路径。
答案 1 :(得分:2)
请参阅this answer on the scalaz-mailing list简短回答是不可能完全按照您的要求进行操作,但通常还有其他方法可以解决您的问题。