Advertisement
vincentmarquez

why monads

Apr 19th, 2013
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.51 KB | None | 0 0
  1. //why monads tutorial
  2.  
  3. class CompanyInfo { /* important shit here */ }
  4.  
  5. def getCompanyInfoFromDB(user: User, companyname: String) = ??? //prototype method
  6.  
  7. //java style classes
  8. class Company { var name: String }
  9. class User { var company: Company }
  10. class Session { var user: User }
  11.  
  12. def getCompanyInfo(session: Session, newname: String): CompanyInfo {
  13.    //BIG FAT RACE CONDITION, POSSIBLE NPE. NOT THREAD SAFE
  14.    if (session.user != null && session.user.company != null)
  15.      return getCompanyInfoFromDB(session.user, session.user.company.name)
  16.    else
  17.     return null
  18. }
  19.  
  20. //Functional (mutable) style
  21. class Company { var name: Option[String] }
  22. class User { var company: Option[Company] }
  23. class Session { var user: Option[User] }
  24.  
  25. def getCompanyInfoDesugared(session: Session, newname: String): Option[CompanyInfo] {
  26.    //what is really happening:
  27.    return session.user.flatMap(user =>
  28.     user.company.flatMap(company =>
  29.                 company.name.map(compname =>
  30.             getCompanyInfoFromDB(user, compname)
  31.         )
  32.        )
  33.    )
  34. }
  35. //Equivalent to above code, just using scala's monad syntax
  36. def getCompanyInfoMonadic(session: Session, newname: String): Option[CompanyInfo] {
  37.    //MONADIC STYLE BECAUSE OPTION IS A MONAD!!!
  38.    return for {
  39.     user <- session.user
  40.       company<- user.company //if any of these are None, we terminate and return None
  41.          name<- company.name
  42.         //we could keep going deeper, doesn't matter no nesting syntax!
  43.     } yield
  44.         getCompanyInfoFromDB(user, name)
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement