CodeToLive

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