обработка побочных эффектов с помощью Monad - PullRequest
0 голосов
/ 04 апреля 2020

В приведенной ниже программе я не могу понять мыслительный процесс за реализацией map и flatMap. Вот почему я не могу думать о том, как реализовать map и flatMap в случае различных типов побочных эффектов, например, оператора print и т. Д. c.

Может кто-нибудь объяснить, пожалуйста?

import java.util.UUID

object MonadSideEffectToPure extends App {

  case class User(id: UUID, email: String)
  case class Address(id: Int, city: String, country: String)
  case class Email(to: String, subject: String, body: String)

  def findUser(id: UUID): User = {
    //perform database operations and return user
    User(id, "test@gmail.com")
  }

  def getAddress(user: User): Address = {
    //perform database operation and return address
    Address(1, "haryana", "India")
  }

  def sendEmail(email: Email) = {
    //send an email using third party service
    println(s"email sent to ${email.to} ...")
  }

  //Create IO Monad
  class IO[A] private(block: => A) {
    def run : A = block
    def flatMap[B] (f:A => IO[B]): IO[B] = IO {f(run).run}
    def map[B] (f: A => B): IO[B] = flatMap(a => IO{f(a)})
  }

  object IO {
     def apply[A](block: => A): IO[A] = new IO(block)
  }

  val result: IO[Unit] = for {
    user <-  IO { findUser(UUID.randomUUID())}
    address <- IO {getAddress(user)}
    _ <- IO {sendEmail(Email(user.email, address.city + "News", "Good News"))}
  } yield()

  result.run
}
...