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