Как мне составить несколько монад?IO / Future и, возможно, даже с State и Option - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь составить монады в Scala и выполнить несколько запросов к серверу.вот фрагмент кода, который я использую.Я стараюсь не использовать плоскую карту, насколько это возможно, используя только для понимания.есть идеи?Я знаю, как использовать монадные трансформеры, но я не знаю, как составлять несколько монад.кто-нибудь может мне помочь?

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

1 Ответ

0 голосов
/ 23 октября 2018

Итак, несколько вещей.

Если вы запускаете фьючерсы внутри для понимания, тогда они будут работать в последовательности, а не параллельно - если это ваше намерение, тогда все в порядке.Если нет, то создайте для них экземпляр вне для понимания.

Вы не можете смешивать монадические контексты внутри для понимания.

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

// No
for {
  a <- Some(5)
  b <- Future(10)
} yield 5 * 10
...