# Defining a data type

## Algebraic datatype: a Traffic-light modelization

A simple traffic light enumeration-like model:

```
data TrafficLight = Red | Yellow | Green deriving (Show, Eq)
```

The Traffic light can have three states only:

`Red`

: all cars must stop`Yellow`

: all cars must stop`Green`

: cars may pass

A *transition* function could be defined that will give the next
state of the traffic light according to its present state.

```
nextState :: TrafficLight -> TrafficLight -- type annotation
nextState Red = Green
nextState Yellow = Red
nextState Green = Yellow
```

## Binary Tree Data Structure and Depth of a Binary Tree

A simple binary tree structure:

```
data BinaryTree a = EmptyBinaryTree | Node a (BinaryTree a) (BinaryTree a) deriving (Show, Eq)
```

This is called a recursive algebraic datatype.

The depth of this binary tree can be computed using this function:

```
depth :: (BinaryTree a) -> Int
depth EmptyBinaryTree = 0
depth (Node _ left right) = 1 + (max (depth left) (depth right))
```