The first half of this chapter explains what is functional programming in Scala. And the latter, through one of the most popular Scala library called Scalaz, the important concepts in functional programming; Functors, Applicative Functors, and Monads.
In this blog post, I will explain about my shallow understanding of those three handsome guys.
Disclaimer: the below is not thorough nor correct definitions of those concepts at all. It simply is a starting point for understanding them.
Functors, Applicative Functors, and Monads, for the first step
If you don’t know very much about functors, applicative functional, and monads (like me as a Scala newbie), maybe a table below could help understand them.
Who are you?
does what, mainly
in which method
Functor
maps a value A in some container F
map[B](f: A => B): F[B]
Applicative
applies a method A => B in some container F to a value A in another container F
ap[A,B](f: => F[A => B]): F[B]
Monad
flatMaps a value A in some container F
bind[A, B](f: A => F[B]): F[B]
Here, the word container means kind of an abstraction of a way of holding value. Option, List and Future are good examples of them in Scala language.
type
how it holds value
Option[T]
holds a value of type T (Some(value)), or nothing (None)
List[T]
holds multiple values of type T. (that is, homogeneous collection of type T)
Future[T]
holds some concurrent block that will eventually return the value of type T, or Throwable as a failure result.
NOTE: Strictly speaking, container should actually be called a type class. See Wikipaedia for further explanations.
And Monads flatMap (or bind), this flattens the nested container as a result of mapping.
Anyway for better understandings let’s check out their implemtation in Scalaz’s source code with some examples.
// for comprehension for { intValue <- toIntOption(value) divBy3Value <- toDivBy3Option(intValue) mappedValue <- map.get(divBy3Value) } yield mappedValue
// with sexy operators // >>= is an alias for bind Monad[Option].point(value) >>= toIntOption >>= toDivBy3Option >>= map.get
But what are these XxxOps and XxxSyntax??? This is kind of what we call pimp my library pattern in Scala, to add methods on target class or trait without modifying it, using the power of implicit conversion.
Its basic structure in Scalaz can be simplified like this:
val original = newOriginal original.additionalMethod
By the way,
Is there any easy good way to write some fancy operators like "η", "⊛", or "∘", without simply copy-and-pasting them? Once in a while I feel like to indulge in using them with a bit of fear about Gestaltzerfall…