我在斯卡拉实施以下单子它包装调度结果与用于请求斯卡拉单子随身携带的未来[T]
import org.json4s._
import scala.concurrent.{ExecutionContext, Future}
case class Result[T](url:String,params:JValue,result:Future[T]) {
self =>
def flatMap[S](f: T => Result[S])(implicit executionContext:ExecutionContext):Result[S] = {
val result_ = f andThen (_.result)
Result(self.url,self.params,this.result flatMap result_)
}
def map[B](f: T => B)(implicit executionContext:ExecutionContext):Result[B] =
Result(this.url,this.params,this.result map f)
}
我这个问题的URL,而params HTTP URL/PARAMS具有flatmap
的定义。对于flatmap
是正确的,url
和params
需要来自f
,即f: T => Result[S]
。在上面的例子中,虽然它编译得很好,并且签名正好是我需要的,但self.url
和self.params
意味着url
和params
永远不会更新为Result
,即flatMap
ed,换句话说,我不知道当调用flatMap
时,如何获得应用f
的url
和param
变量。
虽然T
是必需的Request[S]
,它不是必需的url
和params
,所以这将是分离出从result
的url,params
的斯卡拉方式,所以我可以正确地定义flatMap
?
注:单子背后的一般目的是这样我就可以从调度HTTP
结果工作(即Future[T]
),同时能够携带用于请求url
和params
各地,拥有flatMaps
更新url
,params
和result
(它是一个新的请求),其中的地图只是修改result
编辑:这里是我当前如何使用单子
val restResponse = for {
token <- Authenticate.Helpers.mainLogin // Type Result[String]
userSessionToken <- Authenticate.Helpers.loginToken("someUser","somePassword",token) // Type Result[String]
someOtherCommand <- DataService.getInitialData(token,userSessionToken) map
(_ \ "someData" \ "someMoreData" \\ "evenMoreData" match {
case JString(s) => s
case JArray(items) =>
items.collectFirst { case JString(s) =>s}.head
}) // Type Result[String], the map is working over the `JValue` inside Future[JValue] that is held within the Request[JValue]
someData <- DataService.getData(token,userSessionToken) // Type Result[JValue]
} yield itemSummaries
println(restResponse.url) // should print the url of someData, but is instead printing the url of token. restResponse.result is the correct value however
的例子0
注意之前,这对于理解只是工作过Future[T]
,然而,在这方面,我失去了使用
如果您打算将“flatMap”的计算基于非确定性结果,那么您听起来并没有确定性的'flatMap'。因此,你不能写'flatMap',因为你想写它。 – wheaties
什么是scala的惯用方式来解决我正在尝试解决的问题呢? (即用'params/url'来标记结果,同时能够将'result'作为单子?] 另外'url'和'params'是确定性的,'result'不是。 – mdedetrich