Scalaµ

Small extensions to Scalaz and examples for exploring and teaching the software engineering benefits of defining algebraic data types as initial F-algebras.

DEPRECATED

This project has been deprecated in favor of the much more complete and mature https://github.com/slamdata/matryoshka.

Getting Scalaµ

resolvers += "laufer@bintray" at "http://dl.bintray.com/laufer/maven"

libraryDependencies += "edu.luc.etl" %% "scalamu" % "0.4.2"

You can also just clone this project and play around with the example worksheets.

Scalaµ works with Scala 2.10 and 2.11 and uses Scalaz 7.2.0.

Quick Start

Natural numbers as the initial algebra for the Option endofunctor.

import scalaz._
import Scalaz._
import scalamu._

type Nat = µ[Option]

val zero = In[Option](None)
val succ = (n: Nat) => In[Option](Some(n))

val two   = succ(succ(zero))
val three = succ(two)

Conversion to Int as a catamorphism.

val toInt: Algebra[Option, Int] = {
case None    => 0
case Some(n) => n + 1
}

three cata toInt assert_=== 3

Conversion from Int as an anamorphism.

val fromInt: Coalgebra[Option, Int] = n => {
require { n >= 0 }
if   (n == 0) None
else          Some(n - 1)
}

µ.unfold(7)(fromInt) cata toInt assert_=== 7

val plus: Nat => Algebra[Option, Nat] = m => {
case None    => m
case Some(n) => succ(n)
}

two cata plus(three) cata toInt assert_=== 5

Available here.

Guide to Examples

We recommend starting with this standalone example of arithmetic expressions.

We then recommend looking at the example worksheets in this order:

1. natf
2. natoption
3. natHigherKinded
4. mylist
5. orgchart

To run an example worksheet:

\$ sbt test:console