Scala 如何在进程中断时终止控制台输入

Scala 如何在进程中断时终止控制台输入,scala,functional-programming,scalaz,scalaz-stream,Scala,Functional Programming,Scalaz,Scalaz Stream,我正在玩Scalaz流库,并试图创建一个简单的控制台应用程序 我遵循了教程,他们有一个控制台读写示例 但我面临着一个奇怪的问题,我不知道该如何解决 这是我的代码: import scala.concurrent.duration._ import scalaz.concurrent.Task object StreamApp extends App { (new StreamExec).go3 } class StreamExec { def gets: Task[String]

我正在玩Scalaz流库,并试图创建一个简单的控制台应用程序

我遵循了教程,他们有一个控制台读写示例

但我面临着一个奇怪的问题,我不知道该如何解决

这是我的代码:

import scala.concurrent.duration._
import scalaz.concurrent.Task

object StreamApp extends App {

  (new StreamExec).go3
}

class StreamExec {

  def gets: Task[String] = Task {
    scala.io.StdIn.readLine()
  }

  def puts(ln: String, answer: String): Task[Boolean] = Task {
    println(ln)
    ln.contains(answer)
  }

  def go3 {

    import scalaz.stream.Process

    val q = Seq("1", "2", "3") map { case p =>

      println(s"Say $p")

      val in = Process eval gets

      val out = in flatMap { line =>
        Process eval puts(line, p)
      }

      out.runLog.attemptRunFor(5.seconds)
    }

    println(q)
  }
}
当我运行它时,输出如下所示

background log: info: Say 1
1
background log: info: 1
background log: info: Say 2
background log: info: Say 3
3
3
background log: info: 3
background log: info: List(\/-(Vector(true)), -\/(java.util.concurrent.TimeoutException), \/-(Vector(true)))
1正常,2在5秒后超时失败,然后3需要输入两次

问题是,当进程按时失败时,控制台输入没有被解除阻止(未终止),并且仍在等待用户的输入

我试图用期货来复制它,但也面临着同样的问题


谢谢。

通常在scalaz流中,您获得(获取值),然后处理它并终止

在本例中,如果您的处理只是读取打印,则不需要运行日志,因此您只需要处理任意效果

我认为这个代码可能会有帮助

eval(gets)
.flatMap { name =>   Process(1,2,3).flatMap( ln => eval(puts(ln,name))) }
.take(3)
.run.run
您真正需要的是从Process1组合器中选择一个来
引导您的进程,最终将终止您的程序。
您可以尝试使用各种组合器来构建您的程序