2014-12-15 4 views
10

Ich bekomme kein einfaches scalaz-stream-Beispiel, das von TCP liest und in std out schreibt.Wie liest man von TCP und schreibt auf stdout?

val src = tcp.reads(1024) 
val addr = new InetSocketAddress(12345) 
val p = tcp.server(addr, concurrentRequests = 1) { 
    srC++ tcp.lift(io.stdOutLines) 
} 
p.run.run 

Es sitzt nur dort, nichts zu drucken.

Ich habe auch versucht, verschiedene Anordnungen to verwenden, immer mit dem tcp.lift Beschwörung eine Process[Connection, A] zu bekommen,

tcp.server(addr, concurrentRequests = 1)(src) map (_ to tcp.lift(io.stdOutLines)) 

enthält, die nicht einmal kompilieren.

Muss ich die Quelle und Druckströme zusammen wye? Ein Beispiel, das ich auf der original pull request für tcp anstelle von nio fand, schien dies anzuzeigen, aber wye scheint nicht mehr auf Process zu existieren, so herrscht Verwirrung leider.


bearbeiten es stellt sich heraus, dass zusätzlich Probleme der Art von Paul erklärt, müssen Sie auch, indem Sie p.map(_.run.run).run.run die inneren Prozesse „von Hand“, zum Beispiel laufen. Ich denke nicht, dass das der idiomatische Weg ist, dies zu tun, aber es funktioniert.

Antwort

5

Sie müssen src durch die Senke übergeben, um tatsächlich etwas zu schreiben. Ich denke, das sollte es tun:

import scalaz.stream.{io,tcp,text} 
import scalaz.stream.tcp.syntax._ 

val p = tcp.server(addr, concurrentRequests = 1) { 
    tcp.reads(1024).pipe(text.utf8Decode) through tcp.lift(io.stdOutLines) 
} 
p.run.run 

Der Ausdruck srC++ tcp.lift(io.stdOutLines) sollte wirklich eine Art Fehler sein. Der Typ tcp.reads(1024) ist Process[Connection,ByteVector] und der Typ tcp.lift(io.stdOutLines) ist Process[Connection, String => Task[Unit]]. Das Anhängen dieser beiden Prozesse ist nicht sinnvoll, und der einzige Grund für die Typchecks ist die Kovarianz Process[+F[_],+O]. Scala ist "hilfreich" auf Any zu schließen, wenn Sie zwei Prozesse mit nicht verwandten Ausgabetypen anhängen.

Eine zukünftige Version von scalaz-Stream kann eine Einschränkung auf ++ und anderen Funktionen hinzufügen, die Kovarianz um sicherzustellen, dass die obere Grenze ausnutzen, dass etwas nicht nutzlos wie Any oder Serializable berechnet wird. Dies würde einen großen Beitrag zur Vermeidung solcher Fehler leisten. Stellen Sie in der Zwischenzeit sicher, dass Sie alle Arten von Funktionen verstehen, mit denen Sie arbeiten, was sie tun und wie Sie sie zusammenfügen.

+1

Verwendung von sbt Warze-Entferner würde wahrscheinlich, dass jede Schlussfolgerung fangen. –

+0

Meinst du 'durch io.stdOutLines', ohne' tcp.lift'? Es scheint aber immer noch nichts aus dem Strom zu ziehen. –

+0

Ok - mit dem 'tcp.lift' entfernt, funktioniert das, aber beachte, dass du' p.map (_. Run.run) .run.run' haben musst, um die inneren Prozesse zu starten. –

Verwandte Themen