ฉันจะเขียนหลาย Monads ได้อย่างไร IO / อนาคตและอาจมีสถานะและตัวเลือกด้วย

ฉันกำลังพยายามเขียน monads ใน Scala โดยทำการร้องขอไปยังเซิร์ฟเวอร์ นี่คือข้อมูลโค้ดที่ฉันใช้ ฉันพยายามไม่ใช้ flatmap มากที่สุดเท่าที่จะเป็นไปได้ใช้เพื่อความเข้าใจเท่านั้น มีความคิดอะไรบ้าง? ฉันรู้จักใช้ Monad Transformers แต่ฉันไม่รู้วิธีเขียน 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

person ksp0422    schedule 23.10.2018    source แหล่งที่มา
comment
พระภิกษุโดยทั่วไปไม่แต่ง หม้อแปลงไฟฟ้าเป็นกรณีพิเศษที่ประกอบขึ้นในความหมายหนึ่ง คุณสามารถซ้อนหม้อแปลงหลายตัวเพื่อประกอบเป็น Monad หลายตัวได้   -  person n. 1.8e9-where's-my-share m.    schedule 23.10.2018
comment
คุณกำลังพยายามเขียนพระโมนาด เช่น ใส่โมนาดหนึ่งเข้าไปในอีกโมนาดหนึ่ง เช่น Future โดยมี Option อยู่ข้างใน หรือคุณกำลังพยายามทำงานกับโมนาดอื่นด้วยความเข้าใจ for เดียวใช่หรือไม่   -  person Grisha    schedule 23.10.2018
comment
ไม่ชัดเจนว่า for เป็นวิธีที่ถูกต้องในการใช้รหัสนี้ การมอบหมายงานทั้งหมดและคำสั่ง Await จะชัดเจนยิ่งขึ้นหากเขียนออกมาเป็นโค้ดปกติ ในท้ายที่สุดนี่เป็นเพียง map ที่ซ้อนอยู่ใน flatMap และอาจดูชัดเจนยิ่งขึ้นที่เขียนออกมาแบบนั้น และเหตุใดจึงโทร flatMap และล้อมผลลัพธ์ด้วย Future แทนที่จะโทร map   -  person Tim    schedule 23.10.2018


คำตอบ (1)


ดังนั้นบางสิ่ง

หากคุณเปิดฟิวเจอร์สภายใน a เพื่อความเข้าใจ ฟิวเจอร์สเหล่านั้นจะทำงานเป็นลำดับแทนที่จะขนานกัน - ถ้านี่คือความตั้งใจของคุณ ก็ไม่เป็นไร ถ้าไม่เช่นนั้น ให้ยกตัวอย่างสิ่งเหล่านั้นภายนอกเพื่อความเข้าใจ

คุณไม่สามารถผสมบริบทสงฆ์ภายใน a เพื่อความเข้าใจได้

// 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