gpt4 book ai didi

scala - Scalaz 中 *> 和 <* 的用途是什么

转载 作者:行者123 更新时间:2023-12-01 10:46:01 26 4
gpt4 key购买 nike

让我们看一下 finish 在 Scalaz 任务上的实现

def onFinish(f: Option[Throwable] => Task[Unit]): Task[A] =
new Task(get flatMap {
case -\/(e) => f(Some(e)).get *> Future.now(-\/(e))
case r => f(None).get *> Future.now(r)
})

这里的 *> 完成了什么?

最佳答案

这是 Apply句法。我最近在scalaz的examples子项目中添加了一些使用apply语法的例子,具体可以看*>的一些讨论。和 <*这里:

https://github.com/scalaz/scalaz/blob/series/7.2.x/example/src/main/scala/scalaz/example/ApplyUsage.scala#L94-L130

这个想法是,您在组合器的任一侧评估两个“有效”计算,使用 Apply 实例组合效果,但丢弃其中一个结果值。 <*丢弃右边的值,*>丢弃左边的值。

在您的示例中,我们使用 Apply[Future] 组合效果,效果是 future 的延迟计算。在第一个案例匹配中,我们有这个:

 f(Some(e)).get *> Future.now(-\/(e))

所以 f(Some(e)).get返回 Future[Unit]Task当我们应用 f 时正在包装功能,这个任务只是为了它的副作用而运行。申请的右半部分Future.now(-\/(e))是我们要返回的值,在 Future 中,但我们希望这个 future 取决于副作用的结果 Future[Unit] .结果是我们得到一个 Future[-\/] ,但在副作用完成之前,它不会完成。

我发现这些组合器易于理解的一个很好的例子是解析器组合器。假设我们有一些解析器:

trait Parser[A]

这是会消耗一些输入并在此过程中产生 A 的东西。假设我们有一个方法可以解析一个字符:

def chr(c: Char): Parser[Char]

和一些解析任意字符串的方法:

def foo: Parser[String]

然后我们可以为括号内的任意字符串创建一个解析器:

val parentheticalFoo: Parser[String] = chr('(') *> foo <* chr(')')

这会创建一个解析器,虽然它将使用左括号,然后是 foo,然后是右括号,但它只会返回解析 foo 的结果。我们不关心实际接收 chr('(') 的输出和 chr(')')解析器,但我们希望它们消耗输入的效果仍然组合到生成的解析器中。

关于scala - Scalaz 中 *> 和 <* 的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25901451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com