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:

OkapiAlgebra
next0
N/A1
<|>+
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.

Previous
Servant integration