使用IO打印输入+功能输出

时间:2015-03-31 17:23:04

标签: io scalaz

我写了一个简单的函数(我打算)打印出(1)用户输入+(2)输入" foobar"添加到它:

import scalaz.effect.IO
import scalaz.effect.IO._

def simplePrint: (IO[Unit], IO[String]) = {
    val input = readLn
    val result = input.map(_ + "foobar")
    (input.flatMap(putStrLn), result)
}

def runExample: Unit = {
    val (in, result) = simplePrint
    println(">" + in.unsafePerformIO)
    println(result.unsafePerformIO)
}

输入REPL,我测试了它。

当我运行runExample方法时,我输入" 555",看到输出,然后键入" 1234"。

scala> net.repl.Foo.runExample
555
>()
1234foobar

我原本打算输入:" 555",然后看:

>555
555foobar

如何更改上述方法?

1 个答案:

答案 0 :(得分:2)

如果您多次拨打unsafePerformIO,可能是您的计划出现问题(理想情况下您使用的是SafeApp而根本不会调用它)。混合未跟踪效果和IO也是不必要的混乱。您希望所有效果排序,如下所示:

scala> val action = putStrLn(">") >> readLn.map(_ + "foobar") >>= putStrLn
action: scalaz.effect.IO[Unit] = scalaz.effect.IOFunctions$$anon$6@5a2ab2df

scala> action.unsafePerformIO
>
555foobar

但是,这并不会在输入时回显字符。我很确定我已经编写了代码来执行此操作(使用getChar和类似手动unfoldWhileM),如果您感兴趣,我可以尝试稍后进行挖掘。< / p>