Возьмите этот простой бит кода:Простой поток управления в scalaz эффект
var line = "";
do {
println("Please enter a non-empty line: ")
line = readLine()
} while (line.isEmpty())
println("You entered a non-empty line: " + line)
Это, безусловно, не особенно элегантно, особенно в связи с неудачным обзорного из line
- однако, я думаю, что это довольно просто читать.
Теперь пытается перевести это непосредственно scalaz эффект, я придумал:
def nonEmptyLine: IO[String] = for {
_ <- putStrLn("Please enter a non-empty line:")
line <- readLn
r <- if (line.isEmpty()) nonEmptyLine else IO(line)
} yield r
(for {
line <- nonEmptyLine
_ <- putStrLn("You entered a non-empty line: " + line)
} yield()).unsafePerformIO
Что заставляет меня чувствовать, что я что-то не хватает, так как это не чувствует, как улучшение вообще? Есть ли какой-то элемент управления потоком более высокого порядка, который мне не хватает?