Functional Programming
featuring Swift
Frank Kair
Por que funcional?
● Complexidade → Modularidade
Por que funcional?
● Complexidade → Modularidade
● Decomposição dos problemas
Por que funcional?
● Complexidade → Modularidade
● Decomposição dos problemas
● Composição (glue / chain) de operações
Por que funcional?
● Complexidade → Modularidade
● Decomposição dos problemas
● Composição (glue / chain) de operações
● Paradigma diferente, mais ferramentas
Por que funcional?
Introdução e ideias
let intro = FunctionalProgramming(withContent: .Intro)
intro.start()
Introdução
● “...treats computation as the evaluation of mathematical functions and avoids
changing-state and mutable data”
● “...programming is done with expressions instead of statements”
● No side effects
Wikipedia
Introdução
A monad is a triple (T, n, u) where T is an endofunctor T: X → X and n: I → T and u: T x T → T
are 2 natural transformations satisfying these laws:
Identity law: u(n(T)) = T = u(T(n))
Associative law: u(u(T x T) x T)) = u(T x u(T x T))
In other words, a monad in X is just a monoid in the category of endofunctors of X, with
product x replaced by composition of endofunctors and unit set by the identity endofunctor.
Introdução
Introdução
?
Higher order functions
f( f(x), g(x) ) → h(x)
Higher order functions
Funções que aceitam funções como parâmetro e/ou que retornam funções.
Higher order functions
Funções que aceitam funções como parâmetro e/ou que retornam funções.
Swift → Closures
Higher order functions
Higher order functions
Higher order functions
Muito código compartilhado…
Higher order functions
Muito código compartilhado…
Com generics e closures, podemos construir estruturas mais concisas
e reutilizáveis.
Higher order functions
Higher order functions
Map
Filter
Reduce
Exemplos com Map, Filter e Reduce
Exemplos com Map, Filter e Reduce
Exemplos com Map, Filter e Reduce
Exemplos com Map, Filter e Reduce
Exemplos com Map, Filter e Reduce
Exemplos com Map, Filter e Reduce
Exemplos com Map, Filter e Reduce
Exemplos
Meios != Fins
Imutabilidade
(Ou structs vs classes)
Imutabilidade
Classes
● Reference semantics
● Herança
Imutabilidade
Classes
● Reference semantics
● Herança
Structs
● Value semantics
Stack vs Heap
Stack
● Como a estrutura de dados Stack: com push e pop
Stack vs Heap
Stack
● Como a estrutura de dados Stack: com push e pop
● Estática
Stack vs Heap
Stack
● Como a estrutura de dados Stack: com push e pop
● Estática
● Rápida
Stack vs Heap
Stack
● Como a estrutura de dados Stack: com push e pop
● Estática
● Rápida
● Tamanho limitado
Stack vs Heap
Stack
● Como a estrutura de dados Stack: com push e pop
● Estática
● Rápida
● Tamanho limitado
● Lifetime: Escopo da função (stack frames)
Heap
● Estrutura complexa
Stack vs Heap
Stack vs Heap
Heap
● Estrutura complexa
● Dinâmica: Procura-se blocos de memória livre para alocação de memória
Stack vs Heap
Heap
● Estrutura complexa
● Dinâmica: Procura-se blocos de memória livre para alocação de memória
● Lenta (em comparação com stack)
Stack vs Heap
Heap
● Estrutura complexa
● Dinâmica: Procura-se blocos de memória livre para alocação de memória
● Lenta (em comparação com stack)
● Lifetime: Indeterminado → Reference counting
Stack vs Heap
Heap
● Estrutura complexa
● Dinâmica: Procura-se blocos de memória livre para alocação de memória
● Lenta (em comparação com stack)
● Lifetime: Indeterminado → Reference counting
● Memória → Depende da máquina
Class
Class
Class
Class
Struct
Struct
Struct
“Almost all types in Swift are value types, including arrays,
dictionaries, numbers, booleans, tuples, and enums. Classes are the
exception, rather than the rule.”
EIDHOF, Chris
Functional Swift
● Menos acoplamento / dependência / implicit sharing
Por que Structs?
● Menos acoplamento / dependência / implicit sharing
● Mais fácil de testar
Por que Structs?
● Menos acoplamento / dependência / implicit sharing
● Mais fácil de testar
● Mais modularidade (mesmo output para o mesmo input)
Por que Structs?
Por que Structs?
● Menos acoplamento / dependência / implicit sharing
● Mais fácil de testar
● Mais modularidade (mesmo output para o mesmo input)
● Menos memory leaks (strong, weak e unowned…)
Exemplos com struct
Exemplo
Exemplo
Exemplo Account
Exemplo Account
...
...
...
Class → Struct
Functor and Monad
devs.forEach {
print( $0.firstImpression )
}
// WTF
// …?
// Say waaaaat
// Missing Obj-C already
● Sempre retorna struct
Monad → Chaining
● Sempre retorna struct
● Pipeline de operações
Monad → Chaining
● Sempre retorna struct
● Pipeline de operações
● Legibilidade
Monad → Chaining
Monad → Chaining
● Sempre retorna struct
● Pipeline de operações
● Legibilidade
● Fácil de detectar bug na cadeia de operações
Monad → Chaining
● Sempre retorna struct
● Pipeline de operações
● Legibilidade
● Fácil de detectar bug na cadeia de operações
● Optional, array, dictionary...
Conclusões
Do we hate it?
Do we love it?
● Wikipedia (Functional Programming, Monad, Lambda Calculus)
● EIDHOF, Chris - Functional Programming
● “Why do functional programming matters?” (U of Glasgow)
● objc.io
● http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictu
res.html
Algumas referências

Functional programming feat. Swift (Portuguese)