[英]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子項目的例子,你可以在這里特別看到*>
和<*
討論:
這個想法是你正在評估組合器兩側的兩個“有效”計算,使用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.