В приведенной ниже программе я не могу понять мыслительный процесс за реализацией 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
}