簡體   English   中英

Scalaz中*>和<*的目的是什么?

[英]What is the purpose of *> and <* in Scalaz

讓我們來看看Scalaz Task上的finish的實現

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語法。 我最近添加了一些使用apply語法到scalaz的examples子項目的例子,你可以在這里特別看到*><*討論:

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

這個想法是你正在評估組合器兩側的兩個“有效”計算,使用Apply實例來組合效果,但丟棄其中一個結果值。 <*拋棄右邊的值, *>拋棄左邊的值。

在您的示例中,我們使用Apply [Future]來組合效果,效果是未來的延遲計算。 在第一個案例匹配中我們有這個:

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

所以f(Some(e)).get當我們應用f函數時,返回Task包裝的Future[Unit] ,這個Task正在運行它的副作用。 應用Future.now(-\\/(e))的右半部分是我們想要在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(')') parers的輸出,但我們希望它們消耗輸入的效果仍然可以合並到生成的解析器中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM