如何创建循环流?

时间:2014-09-07 23:02:39

标签: scala scalaz scalaz-stream

我正在尝试使用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)

但它没有编译,因为s2Process[Process.Env[Int,Int]#Y,Int]但需要是Process[Task,Int]

如何指定s2既是输入(s1}又是w的输出?

2 个答案:

答案 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简短回答是不可能完全按照您的要求进行操作,但通常还有其他方法可以解决您的问题。