Scala 控制进程的吞吐量
我试图用计时器控制Scala 控制进程的吞吐量,scala,scalaz,scalaz-stream,Scala,Scalaz,Scalaz Stream,我试图用计时器控制进程[F,a]的吞吐量进程: valp:Process[List,Int]=Process.iterateEval(0)(i=>List(i+1)) val timer:Process[Task,Duration]=time.awakevery(1秒)(Strategy.DefaultStrategy,Strategy.DefaultTimeoutScheduler) val p2=p.zipWith(计时器)((v,d)=>v) 但是编译器说,p2是一个进程[Object,
进程[F,a]
的吞吐量进程
:
valp:Process[List,Int]=Process.iterateEval(0)(i=>List(i+1))
val timer:Process[Task,Duration]=time.awakevery(1秒)(Strategy.DefaultStrategy,Strategy.DefaultTimeoutScheduler)
val p2=p.zipWith(计时器)((v,d)=>v)
但是编译器说,p2
是一个进程[Object,Int]
。根据zipWith()
签名,它应该是一个进程[Task,Int]
如果
F
不是任务,如何限制进程[F,A]
的输出?我试过使用sleeptuntil()
,但我也遇到了类似的问题。没有理由认为F
只会是一个效果完整的单子,比如一个任务。如果您的代码不需要任何效果,那么您可以使用类型进程,如Process0(Process[Nothing,O])
如果您进行更改,您的代码将完全正常工作
val p: Process[Task,Int] = Process.iterateEval(0)(i => Task.now(i + 1)))
或者,如果传递给ItateEval的f
是纯的,那么
val p : Process0[Int] = Process.iterate(0)(i => i + 1)
我的F
实际上不是一个Task
而是一个Rand
monad(来自breeze库,但可以是任何类型的其他monad)。我想我需要使用monad转换器,我想知道scalaz stream中是否有现成的东西可以用于将进程[F1,a]
转换为进程[F2,a]
,用于任何F1和F2。当然F
可能是任何东西,您可能会看到我们使用这种灵活性来构造各种传感器。然而,在你的例子中,F
必须是任何一个拥有zipWith签名(F2[x]>:F[x])的单子,在你的例子中,F
是任务。有一个名为translate
的翻译组合器,它要求你编写多态的F~>G,但是,不确定如何编写Rand~>task如果您只需要随机数的源代码,任务中包装的just evaluate Rand命令,简单递归将完成这项工作(进程具有内部蹦床,因此不需要尾部递归操作是安全的)。我认为translate
方法可以工作。在我的例子中,我对随机持续时间进行采样,因此编写一个Rand~>任务应该是有意义的。非常感谢。