2015-01-13 16 views
1

我從http4s複製一個例子:在scalaz-stream中,如何在接收器終止時運行任務?

// 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) 

這將產生一個編譯錯誤:「終止」「類型單位的表達不符合預期的類型_A」

我只是想打印線

... .onComplete(Process.eval(Task{println("Terminated!")}).drain) 

這裏的問題是,你的Process.eval調用構造一個Process[Task, Unit]而不是Process[Task, Nothing],你通過給問:當宿被終止

回答

1

如果從Process.eval呼叫刪除類型它應該工作類型明確。之後調用drainProcess[Task, Unit]轉換爲Process[Task, Nothing]

更新:這裏是執行上完成一些副作用的水槽的例子:

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 
+1

或者你甚至可以用'的onComplete(EVAL _(/ *你的任務* /))'。注意使用'eval_'而不是'eval' –

+0

謝謝你的回覆,但是這給我留下了'''表達式類型Process [Any,Nothin]不符合預期的類型stream.Sink [Task,WebsocketBits。 WebSocketFrame]''' – Atle

+0

@Atle試圖將你的接收器分解成兩個'val's,並且可能向它們添加類型註釋。你傳遞給'onComplete'的過程應該是'Process [Task,Nothing]'類型。 –

相關問題