# loyolachicagocode / scalamu  0.4.5

Scala versions: 2.10 2.11

# 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µ

To use Scalaµ in your project, add these lines to your `build.sbt`:

``````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