Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
在scalaz stream中,当接收器终止时,如何运行任务?_Scala_Scalaz Stream - Fatal编程技术网

在scalaz stream中,当接收器终止时,如何运行任务?

在scalaz stream中,当接收器终止时,如何运行任务?,scala,scalaz-stream,Scala,Scalaz Stream,我从http4s复制了一个示例: // Print received Text frames, and, on completion, notify the console val sink: Sink[Task, WebSocketFrame] = Process.constant { case Text(t) => Task.delay(println(t)) case f => Task.delay(println(s"Unknown type:

我从http4s复制了一个示例:

// Print received Text frames, and, on completion, notify the console
  val sink: Sink[Task, WebSocketFrame] = Process.constant {
    case Text(t) => Task.delay(println(t))
    case f       => Task.delay(println(s"Unknown type: $f"))
  }.onComplete(Process.eval[Task, Nothing](Task{println("Terminated!")}).drain)
这将产生一个编译错误:“Unit类型的表达式不符合预期的类型_a”


我只想打印行“Terminated!”当接收器终止时,如果从
进程中删除类型,它应该可以工作。eval
调用:

... .onComplete(Process.eval(Task{println("Terminated!")}).drain)
这里的问题是,您的
Process.eval
调用构造了一个
过程[任务,单元]
,而不是一个
过程[任务,无任何内容]
,正如您所要求的那样,通过明确给出类型。调用
drain
之后将
进程[任务,单元]
转换为
进程[任务,无任何内容]

更新:下面是一个接收器的示例,它在完成时会产生一些副作用:

scala> val sink = io.stdOutLines.onComplete(Process.eval_(Task(println("END"))))
sink: scalaz.stream.Process[[x]scalaz.concurrent.Task[x],String => scalaz.concurrent.Task[Unit]] = Append(Emit(Vector(<function1>)),Vector(<function1>, <function1>))

scala> Process("a", "b", "c").toSource.to(sink).run.run
a
b
c
END
scala>val sink=io.stdOutLines.onComplete(Process.eval(Task(println(“END”)))
sink:scalaz.stream.Process[[x]scalaz.concurrent.Task[x],String=>scalaz.concurrent.Task[Unit]=Append(Emit(Vector()),Vector(,)
scala>Process(“a”、“b”、“c”).toSource.to(sink.run.run
A.
B
C
结束

或者您甚至可以使用
完成(评估(/*您的任务*/)
。注意使用
eval\uuu
而不是
eval
谢谢你的回复,但这让我不得不使用
类型进程的表达式[Any,Nothin]不符合预期的类型流。Sink[Task,WebsocketBits.WebSocketFrame]
@Atle尝试将你的Sink分成两个
val
并可能为它们添加类型注释。传递给
onComplete
的进程应该是
process[Task,Nothing]
类型。我已经将“正在完成”的进程重构为
val p:process[Task,Nothing]
,当我像这样拆分onComplete调用时,编译器仍然会发出相同的错误
val p:process[Task,Nothing]=process.eval(Task{println(drain val sink:sink[Task,WebSocketFrame]=Process.constant{case Text(t,x)=>Task.delay(println(t))case f=>Task.delay(println(s“未知类型:$f”)}val sinkWithComplete:sink[Task,WebSocketFrame]=sink.onComplete(p)