scalaz效果的简单控制流程
发布时间:2020-12-16 18:35:25 所属栏目:安全 来源:网络整理
导读:拿这个简单的代码: var line = "";do { println("Please enter a non-empty line: ") line = readLine()} while (line.isEmpty())println("You entered a non-empty line: " + line) 它绝对不是特别优雅,特别是对于不幸的线条范围 – 但是,我认为阅读起来非
|
拿这个简单的代码:
var line = "";
do {
println("Please enter a non-empty line: ")
line = readLine()
} while (line.isEmpty())
println("You entered a non-empty 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
这让我觉得我错过了什么,因为这根本不是一种改进?我缺少一些更高阶的控制流程吗? 解决方法
你可以通过跳过for表示法并使用组合器来使这个(至少可以说是)更漂亮*>和>> =将所有内容组合在一起:
import scalaz._,Scalaz._,effect._,IO._
val prompt = putStrLn("Please enter a non-empty line:")
def report(line: String) = putStrLn("You entered a non-empty line: " + line)
def nonEmptyLine: IO[String] = prompt *> readLn >>= (
(line: String) => if (line.isEmpty) nonEmptyLine else line.point[IO]
)
然后: scala> (nonEmptyLine >>= report).unsafePerformIO Please enter a non-empty line: You entered a non-empty line: This is a test. 但总的来说,我不确定你应该期望使用scalaz.effect编写的代码比简单的命令式解决方案更简洁或更容易阅读. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
