Ответ 1
Вам нужно передать src
через мойку, чтобы на самом деле написать что-нибудь. Я думаю, это должно сделать это:
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
Выражение src ++ tcp.lift(io.stdOutLines)
должно быть действительно ошибкой типа. Тип tcp.reads(1024)
- Process[Connection,ByteVector]
, а тип tcp.lift(io.stdOutLines)
- Process[Connection, String => Task[Unit]]
. Добавление этих двух процессов не имеет смысла, и единственная причина, по которой он выглядит, связана с ковариацией Process[+F[_],+O]
. Scala "полезно" выводит Any
при добавлении двух процессов с несвязанными типами вывода.
В будущей версии потока scalaz можно добавить ограничение на ++
и другие функции, которые используют ковариацию, чтобы удостовериться, что вычисляемая наименьшая верхняя граница не является чем-то бесполезным, например Any
или Serializable
. Это проделало бы долгий путь для предотвращения таких ошибок. В то же время убедитесь, что вы понимаете типы всех функций, с которыми работаете, что они делают, и как вы их склеиваете.