Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 控制进程的吞吐量_Scala_Scalaz_Scalaz Stream - Fatal编程技术网

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~>任务应该是有意义的。非常感谢。