Bagaimana cara membuat banyak monad? IO / Masa Depan dan bahkan mungkin dengan State dan Option

Saya mencoba membuat monad di Scala dengan melakukan beberapa permintaan ke server. berikut cuplikan kode yang saya gunakan. Saya mencoba untuk tidak menggunakan flatmap mungkin hanya digunakan untuk pemahaman juga. ada ide? Saya tahu menggunakan Monad Transformers, tapi saya tidak tahu cara membuat banyak monad. adakah yang bisa membantu saya?

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

person ksp0422    schedule 23.10.2018    source sumber
comment
Monad pada umumnya tidak dapat dibuat. Transformer adalah kasus khusus yang, dalam arti tertentu, dapat disusun. Anda dapat menumpuk beberapa transformator untuk membuat beberapa monad.   -  person n. 1.8e9-where's-my-share m.    schedule 23.10.2018
comment
Apakah Anda mencoba membuat monad, yaitu memasukkan satu monad ke monad lain, seperti Future dengan Option di dalamnya, atau apakah Anda mencoba bekerja dengan monad berbeda dalam satu pemahaman for?   -  person Grisha    schedule 23.10.2018
comment
Tidak jelas apakah for adalah cara yang tepat untuk menggunakan kode ini. Semua tugas dan pernyataan Await tersebut akan lebih jelas jika ditulis sebagai kode biasa. Pada akhirnya ini hanyalah map yang bersarang di flatMap dan mungkin akan terlihat lebih jelas jika ditulis seperti itu. Dan mengapa memanggil flatMap dan membungkus hasilnya dengan Future daripada hanya memanggil map?   -  person Tim    schedule 23.10.2018


Jawaban (1)


Jadi beberapa hal.

Jika Anda meluncurkan masa depan di dalam pemahaman for maka masa depan tersebut akan berjalan secara berurutan, bukan secara paralel - jika ini niat Anda maka baiklah. Jika tidak maka buat instance-nya di luar pemahaman for.

Anda tidak dapat mencampur konteks monadik di dalam pemahaman for.

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

// No
for {
  a <- Some(5)
  b <- Future(10)
} yield 5 * 10
person Terry Dactyl    schedule 23.10.2018