\ Scalaz中的“ap”是做什么的?
我正在查看分解类型的scalaz,并且我注意到了方法ap
/** Apply a function in the environment of the right of this disjunction. */ def ap[AA >: A, C](f: => AA / (B => C)): (AA / C) = f flatMap (ff => map(ff(_)))
我想我明白它的作用。 现在我想知道什么时候以及为什么要真正使用它? 有没有使用这个ap
函数的例子?
您正在寻找的分离点:
import scalaz.{ /, -/ /-, EitherT }
import scalaz.syntax.ToIdOps
object Testing extends ToIdOps // left and right methods come from there {
// say you have the following method
def someMethod(flag: Boolean): /[Exception, SomeObject] {
if (flag) someObj.right else new Exception("this is a sample").left
}
}
// pattern matching
val x = someMethod match {
case /-(right) => // this is someObject
case -/(err) => // deal with the error
}
// catamorphism
def methodThatDealsWithObj(obj: someObject)
def methodThatDealsWithErr(err: Exception)
someMethod.fold(methodThatDealsWithObj)(methodThatDealsWithErr)
// for comprehensions
// ap behaves just like EitherT.
for {
correctResponse <- EitherT(someMethod)
}
更新
要了解EitherT
和ap
工作原理,请考虑一个Option
,其中包含Some
和None
以及可能的匹配项。 使用Option
,您可以执行以下操作:
for {
a <- someOption
} yield ..
使用scalaz./
,通常在左侧放置一个Exception
,在右侧放置一个“正确”的返回类型。 ap
是一个函数,说如果两者都有正确的类型,就应用这个函数。
for {
correctResponse <- ap(someEitherReturnMethod)
}
用例
最常见的事情我可以在我使用它们的地方疯狂地想到复杂的异步流程,例如OAuth1或OAuth2,我关心细粒度链接错误。
您可以使用/
作为Future
的回报:
def someComplexThirdPartyApiCall: Future[/[Exception, CorrectReturn]] = {
}
因为你可以对期货进行flatMap
,所以你可以链接上面几个方法,收集和传播错误。
例
def method1: Future[/[Exception, String]]
def method2(result: String): Future[/[Exception, String]]
def chainExample: Future[/[Exception, Int]] = {
for {
firstResult <- EitherT(method1)
secondResult <- EitherT(method2(firstResult))
} yield secondResult.toInt
}
链接地址: http://www.djcxy.com/p/78265.html
上一篇: What does "ap" of \/ in Scalaz do?
下一篇: facebook share HTML5 TypeError: getComputedStyle(...) is null