我写了一个简单的函数(我打算)打印出(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
如何更改上述方法?
答案 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>