Weź ten prosty kawałek kodu:Prosty przepływ sterowania w efekcie scalaz
var line = "";
do {
println("Please enter a non-empty line: ")
line = readLine()
} while (line.isEmpty())
println("You entered a non-empty line: " + line)
To zdecydowanie nie szczególnie elegancki, szczególnie niefortunne scopingu z line
- Myślę jednak, że jest to dość łatwe do odczytania.
Teraz próbują tłumaczyć to bezpośrednio do scalaz efekt, mam wymyślić:
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
Który sprawia, że czuję się jakbym czegoś brakuje, gdyż nie ma ochoty na poprawę w ogóle? Czy brakuje mi jakiegoś przepływu kontrolnego o wyższym porządku?