Monads

Monoids

Conventional approach

Combine several components together of type A to generate a "network" or "topology" of type B

Maths Incoming

( Prepare yourselves )

1 + 2 = 3

1 + (2 + 3) = (1 + 2) + 3

1 + 0 = 1

0 + 1 = 1

That's all

Thinking

Like a
Maths Person

What do these things have in common?

How can we generalise these things? 

1 + 2 = 3

1. We've got a bunch of things

2. We've got some way of combining two of them

3. And the result is another one of these things

What does this work for?

*

min/max

and/or

list/string concatination

Why would I even care?

Why is it interesting that the operation returns another thing of the same type?

You can chain together multiple objects using the same operation

1 + 2

1 + 2 + 3

1 + 2 + 3 + 4

1 == 2 == 3 == 4

the result is another one of these things

Closure

1 + (2 + 3) = (1 + 2) + 3

tldr; the order we apply our operation doesn't matter.

We'll get the same results either way

 

((1+2) + 3) + 4

1 + (2 + (3+4))

(1+2) + (3+4)

1 * (2 * 3)

(1 * 2) * 3

1 - (2 -3)
(1 - 2) - 3

What else does this work for?

max( max(12,2), 3) 

max(12, max(2,3)
 

the order you apply the operation doesn't matter

associativity

1 + 0 = 1

there is a special kind of thing ("zero") that, when you combine it with something, just gives you back the original something, as if nothing had happened.

 

Let's see if we can extend this "zero" concept to our other examples

10 * 1
1 * 30

True and True
True and False

False or True
False or False

"" + "hello" = "hello"
[] + [2,3] = 23

This is called the

identity element

1 + 2 = 3
1 + (2 + 3) = (1 + 2) + 3
1 + 0 = 1

You start with a bunch of things, and some way of combining them two at a time.

1. (Closure): The result of combining two things is always another one of the things.

2. (Associativity): When combining more than two things, which combination you do first doesn't matter

3. (Identity element): There is a special thing called "zero" such that when you combine any thing with "zero" you get the original thing back.

Why should I care?
( as a developer )

Closure

You can convert operations to work on lists

1 + 2 + 3 + 4 + 5
vs
reduce/fold (+) [1,2,3,4,5]

Associativity

Divide and conquer algorithms

Parallelization

Incrementalism

Another optimisation

((((((5 * 5) * 5) * 5) * 5) * 5) * 5) * 5

7 multiplications

((5 * 5) * (5 * 5)) * ((5 * 5) * (5 * 5))

= (25 * 25) * (25 * 25)

= 625 * 625 = 390625

Identity

How can I use reduce on an empty list?

When using an incremental algorithm, what value should I start with when I have no data?

Monads

By ..

Monads

  • 1,802