Scala 如何组合多个单子?IO/未来,甚至可能有状态和选项

Scala 如何组合多个单子?IO/未来,甚至可能有状态和选项,scala,functional-programming,monads,Scala,Functional Programming,Monads,我试图在Scala中编写Monad,向服务器发送一些请求。 下面是我正在使用的代码片段。我尽量不使用平面图,只用于理解。有什么想法吗?我知道使用单子变形金刚,但我不知道如何组合多个单子。有人能帮我吗 for { session <- getSession(ticker) //IO[Future[Response]] crumbF = session.flatMap(response => Future(parseCrumb(response.body))) cookies

我试图在Scala中编写Monad,向服务器发送一些请求。 下面是我正在使用的代码片段。我尽量不使用平面图,只用于理解。有什么想法吗?我知道使用单子变形金刚,但我不知道如何组合多个单子。有人能帮我吗

for {
  session <- getSession(ticker) //IO[Future[Response]]
  crumbF = session.flatMap(response => Future(parseCrumb(response.body)))
  cookiesF = session.flatMap(response => Future(response.cookies))
  crumb = Await.result(crumbF, 5 seconds) // Future[String]
  cookies = Await.result(cookiesF, 5 seconds) //Future[Seq[Cookies]]
  data <- getData(ticker, startDate, endDate, interval, crumb, cookies.head) // IO[Future[Response]]
  stocksF = data.flatMap { response =>
    import DefaultBodyReadables._
    Future {
      StockDf.mapDataToDf(response.body)
    }
  }
} yield stocksF
用于{
会话未来(parseCrumb(response.body)))
cookiesF=session.flatMap(response=>Future(response.cookies))
crump=wait.result(crumff,5秒)//Future[String]
cookies=wait.result(cookiesF,5秒)//Future[Seq[cookies]]
资料
导入DefaultBodyReadables_
未来{
StockDf.mapDataToDf(response.body)
}
}
}收益率股票
还有几件事

如果你在一个理解的框架内启动期货,那么它们将按顺序而不是平行运行——如果这是你的意图,那么就好了。如果没有,则在外部实例化它们以供理解

// Yes
for {
  a <- Some(5)
  b <- Some(10)
} yield 5 * 10

// No
for {
  a <- Some(5)
  b <- Future(10)
} yield 5 * 10
你不能把一元上下文混入一个句子中去理解

// Yes
for {
  a <- Some(5)
  b <- Some(10)
} yield 5 * 10

// No
for {
  a <- Some(5)
  b <- Future(10)
} yield 5 * 10
//是的
为了{
a有几件事

如果你在一个理解框架内启动期货,那么它们将按顺序运行,而不是并行运行-如果这是你的意图,那么就可以了。如果不是,那么在理解框架外实例化它们

// Yes
for {
  a <- Some(5)
  b <- Some(10)
} yield 5 * 10

// No
for {
  a <- Some(5)
  b <- Future(10)
} yield 5 * 10
你不能把一元上下文混入一个句子中去理解

// Yes
for {
  a <- Some(5)
  b <- Some(10)
} yield 5 * 10

// No
for {
  a <- Some(5)
  b <- Future(10)
} yield 5 * 10
//是的
为了{

一般来说,单子不组合。从某种意义上说,变形金刚是组合的特例。你可以堆叠几个变形金刚来组合几个单子。你是在尝试组合单子,例如,将一个单子放入另一个单子中,就像一个带有
选项的
未来的
,还是在一个中尝试使用不同的单子e> 对于
理解?目前还不清楚
对于
来说是否是正确的方法。如果将所有的作业和
等待
语句作为普通代码写出来,它们会更清晰。最后,这只是嵌套在
平面图中的一个
映射
,这样写出来可能会更清晰。a为什么要调用
flatMap
并将结果包装到
未来
中,而不仅仅是调用
map
?单子通常不会组合。从某种意义上说,转换器是进行组合的特例。您可以堆叠多个转换器来组合多个单子。您是否尝试组合单子,即将一个单子放入另一个单子,如一个带有
选项的
Future
,或者你想在一个
中使用不同的单子来理解
吗?现在还不清楚
for
是否是使用该代码的正确方法。如果这些赋值和
wait
语句都是以普通代码的形式写出来的,那么它们会更清晰is只是一个嵌套在
flatMap
中的
map
,这样写出来可能看起来更清晰。为什么要调用
flatMap
并将结果包装到
Future
中,而不是只调用
map