Prendete questo semplice pezzo di codice:flusso di controllo semplice a tutti gli effetti scalaz
var line = "";
do {
println("Please enter a non-empty line: ")
line = readLine()
} while (line.isEmpty())
println("You entered a non-empty line: " + line)
E 'sicuramente non particolarmente elegante, in particolare con la sfortunata scoping di line
- tuttavia, penso che sia abbastanza semplice da leggere.
Ora si cerca di tradurre questo direttamente a scalaz effetto, sono venuto su con:
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
Il che mi fa sentire come mi manca qualcosa, in quanto questo non si sente come un miglioramento a tutti? C'è qualcosa di più alto flusso di controllo degli ordini che mi manca?