Concepts

# Algebra

If we understand Okapi's operations and combinators as an algebra, we can apply laws like the distributive property of multiplication to simplify our server's logic.

## Okapi as an algebra

We can look at Okapi as an algebra where the parsers are values, and parser combinators like `<|>`

are operations that act on those values. Okapi is a near-semiring. They are analogous to the values and operations on the set of all real numbers:

Okapi | Algebra |
---|---|

next | 0 |

N/A | 1 |

<|> | + |

do | * |

### Distributive Property

```
-- ab + ac = a(b + c)
x = (do pa; pb;) <|> (do pa; pc;)
y = do
pa
(pb <|> pc)
-- x = y
```

### Zero Product Rule

```
-- 0 * a = 0 * a = 0
x = do
next
pa
y = do
pa
next
z = next
-- x = y = z
```

### Zero Addition Rule

```
-- 0 + a = a + 0 = a
x = next <|> pa
y = pa <|> next
z = pa
-- x = y = z
```

We could simplify `pingpong`

by factoring out the common `methodGET`

parser from the definitions of `ping`

and `pong`

:

```
pingpong = do
methodGET
ping <|> pong
ping = do
pathParam `is` "ping"
return $ setJSON "pong" $ ok
pong = do
pathParam `is` "pong"
return $ setJSON "ping" $ ok
```

In many cases, we can apply algebraic properties like the distributive property to simplify our parsers.