Functional Programming with Cats
Explore functional programming using the Cats library.
Type Classes
import cats._
import cats.implicits._
val sum = Semigroup[Int].combine(1, 2) // 3
val concat = Semigroup[String].combine("a", "b") // "ab"
Functor
import cats.Functor
import cats.instances.list._
val list = List(1, 2, 3)
val mapped = Functor[List].map(list)(_ * 2) // List(2, 4, 6)
Monad
import cats.Monad
import cats.instances.option._
val opt1 = Monad[Option].pure(1) // Some(1)
val opt2 = Monad[Option].flatMap(opt1)(x => Some(x + 1)) // Some(2)
Monoid
import cats.Monoid
case class Order(totalCost: Double, quantity: Double)
implicit val orderMonoid: Monoid[Order] = new Monoid[Order] {
def empty: Order = Order(0, 0)
def combine(x: Order, y: Order): Order =
Order(x.totalCost + y.totalCost, x.quantity + y.quantity)
}
val orders = List(Order(10, 2), Order(20, 3))
val combined = Monoid[Order].combineAll(orders) // Order(30.0, 5.0)
IO Monad
import cats.effect.IO
val io = IO { println("Hello Cats!") }
val program = for {
_ <- io
_ <- io
} yield ()
program.unsafeRunSync() // Prints "Hello Cats!" twice
← Back to Tutorials