Functional Programming

Anouk Ruhaak

@anoukruhaak

State

Door.open = true
Door.open = false
ots_conf = "awesome"
ots_conf = ots_conf + "!!"

State

Side-effects

names = ['Jan', 'Kim', 'Sara']

def double_name():
    for (i, name) in enumerate(names):
        names[i] = name + name
    print names

# prints out: ['JanJan', 'KimKim', 'SaraSara']

problems with state

  • Race conditions
  • Complexity
  • Unpredictability

Race Conditions

groceries = ["apple", "banana", "orange", 
             "strawberries", "cherries"]
basket = []


def get_groceries():
    for item in groceries:
        if item not in basket:
            basket.append(item)
        print(basket)

Race Conditions

problems with state

  • Race conditions
  • Complexity
  • Unpredictability

problems with state

  • Race conditions
  • Complexity
  • Unpredictability

Unpredictable

results

x = 1

def times_two():
    x = x*2


print(times_two())
# => 2

print(times_two())
# => 4

stateless

door = (0, false)

def open_door(door):
    id, state = door
    return (id, true)

Door.open = false
Door.open = true

stateless

def times_two(x):
    return x*2

times_two(2)

x = 1

def times_two():
    x = x*2

no state means

  • Immutability
     
  • Predictability: f(x) == f(x)

Stateless groceries

def split_list(groceries):
    middle = len(groceries)/2
    return (groceries[:middle], groceries[middle:])

Groceries: stateful

groceries = ["apple", "banana", "orange", 
             "strawberries", "cherries"]
basket = []
#cost per items is number of chars
def buy_groceries():
    total = 0
    for item in basket:
        total += len(item)
    print(total)
get_groceries()
buy_groceries()
def get_groceries():
    for item in groceries:
        if item not in basket:
            basket.append(item)
        print(basket)

Functional groceries

def get_groceries():
    for item in groceries:
        if item not in basket:
            basket.append(item)
        print(basket)
def get_groceries(groceries, basket):
    if not groceries:
        return basket
    return get_groceries(groceries[1:], basket + [groceries[0]])

Functional groceries

def buy_groceries():
    total = 0
    for item in basket:
        total += len(item)
    print(total)
def buy_item(item):
    return len(item)

def buy_groceries(basket):
    return sum(map(buy_item, basket))

Functional groceries

def get_groceries(groceries, basket):
    if not groceries:
        return basket
    return get_groceries(groceries[1:], basket + [groceries[0]])


#buy the groceries, each item costs as much as number of characters
def buy_item(item):
    return len(item)

def buy_groceries(basket):
    return sum(map(buy_item, basket))



print(buy_groceries(get_groceries(["apple", "banana", "orange",
                                   "strawberries",
                                   "cherries"], [])))
# => 37

Concluding remark

Functional programming == stateless programming. That's the hard part.

Thank you!

@anoukruhaak