SlideShare una empresa de Scribd logo
1 de 59
Descargar para leer sin conexión
Quem sou eu
• Mestre em Computação pelo IME-USP
• Desenvolvedor C desde 2002
• Objective-C desde 2007 (coisas básicas em Mac OS X antes do iPhone!)
• iOS desde 2010
• Swift desde Agosto/2015
• Tech Lead na Concrete Solutions (estamos contratando)
• Organizador do CocoaHeads SP
• Colaborador do CocoaHeads BR
• Colaborador da Embaixada Brasileira de Appsterdam
Compartilhando código e dependências entre plataformas
Escrevendo uma vez e reutilizando em iOS,
tvOS, watchOS, macOS 😂
Ou…
…veja bem…
Como alterei o tema da minha palestra
E esqueci de enviar a atualização
Usando POP com Programação Funcional
Como entender algumas abstrações usando
Protocol Oriented Programming
A Formula
• Descreva em linguagem natural
• Escreva a assinatura do tipo
• Implemente a logica
• Teste seu código
(não necessariamente nessa ordem)
O que é programação funcional?
• Estilo de programação
• First Class Functions
• Modularização
• Efeitos colaterais
• Imutabilidade
O que é programação funcional?
A monad is just a monoid in the category of endofunctors, what's the
problem?
Crockford’s Law
In addition to its being good and useful, it's also cursed. The curse of
the monad is that once you get the epiphany, once you understand oh,
that's what it is, you lose the ability to explain it to anybody else.
Três protocolos/conceitos
protocol Concattable {
init()
func +(left: Self, right: Self) -> Self
static func concat(list: [Self]) -> Self
}
extension Concattable {
static func concat(list: [Self]) -> Self {
return list.reduce(Self(), combine: +)
}
}
extension Int: Concattable {}
extension Float: Concattable {}
extension String: Concattable {}
extension Array: Concattable {}
func +<T>(left: Set<T>, right: Set<T>) -> Set<T> {
return left.union(right)
}
func +(left: Bool, right: Bool) -> Bool {
return left || right
}
func +<Key, Value>(inout left: Dictionary<Key, Value>,
right:Dictionary<Key, Value>) -> Dictionary<Key, Value> {
for (key, value) in right {
left.updateValue(value, forKey: key)
}
}
protocol Concattable {
init()
func +(left: Self, right: Self) -> Self
static func concat(list: [Self]) -> Self
}
protocol Concattable {
init()
static func concat(left: Self,
right: Self) -> Self
static func concat(list: [Self]) -> Self
}
protocol Concattable {
func makeEmpty() -> Self
func concat(left: Self,
right: Self) -> Self
func concat(list: [Self]) -> Self
}
protocol Concattable {
static func empty() -> Self
static func append(left: Self,
right: Self) -> Self
static func concat(list: [Self]) -> Self
}
protocol Concattable {
static func empty() -> Self
static func append(Self, Self) -> Self
static func concat([Self]) -> Self
}
protocol Concattable {
static func empty() -> m
static func append(m, m) -> m
static func concat([m]) -> m
}
protocol Mappable {
associatedtype Element
func map<OutType>(transform: Element -> OutType) -> Self<OutType>
}
protocol Mappable {
associatedtype Element
static func map<OutType,
OutMappable: Mappable where Element == OutType>(
transform: (Element -> OutType)
) -> OutMappable
}
extension Array: Mappable {
func map<OutType>(transform: (Element -> OutType)) -> [OutType] {
var result = Array<OutType>()
for e in self {
result.append(transform(e))
}
return result
}
}
enum Result<ValueType>: Mappable {
case Failure(error: ErrorType)
case Success(value: ValueType)
func map<OutType>(transform: ValueType -> OutType) ->
Result<OutType> {
switch self {
case .Failure(let error): return .Failure(error)
case .Success(let value):
return .Success(value: transform(value))
}
}
}
protocol Mappable {
associatedtype Element
func map<OutType,
OutMappable: Mappable where Element == OutType>(
transform: (Element -> OutType)
) -> OutMappable
}
protocol Mappable {
associatedtype Element
func map<A, B>(transform: A -> B,
input: Self<A>) -> Self<B>
}
protocol Mappable {
func map(transform: a -> b,
input: Self a) -> Self b
}
protocol Mappable {
func map(a -> b, Self a) -> Self b
}
protocol FlatMappable: Mappable {
init(element: Element)
func flatMap<Out>(transform: Element -> Self<Out>) -> Self<Out>
}
protocol FlatMappable: Mappable {
init(element: Element)
func flatMap<OutType,
OutMappable: FlatMappable where Element == OutType>(
transform: Element -> OutType) -> OutMappable
}
extension Optional: FlatMappable {
typealias Element = Wrapped
func flatMap<Out>(transform: Wrapped -> Optional<Out>) -> Optional<Out> {
switch self {
case .None: return nil
case .Some(let value): return transform(value)
}
}
}
Futures e Promises
Future - objeto mantendo um valor que pode estar disponível em algum
momento
• se o bloco de execução não terminou, dizemos que o Future ainda não
terminou
• ao completar a execução, temos um valor ou um erro - Result FTW
Promise - “extensão” do Future
• Pode retornar um Future
• Promise pode não completar/executar
• read/write
Futures
Future precisa de:
• Contexto de execução
• Tarefa a ser executada
class Future<T> {
typealias Runnable = () -> Result<T>
typealias OnSuccessCallBack = (T) -> ()
typealias OnFailueCallBack = (NSError) -> ()
typealias OnComplete = (result: Result<T>) -
//wrapper de dispatch_queue_t > ()
let extension: ExecutionContext
var result: Result<T>? = nil {
didSet {
self.performCallbacks()
}
}
}
extension Future {
func then<U>(executor: ExecutionContext =
ExecutionContext.defaultContext, task: (value: T) -> Result<U>) ->
Future<U> {
let future = Future<U>()
self.onComplete() { result in
switch result {
case .Error(let e):
syncronized(future) {
future.result = Result<U>(e)
}
case .Value(let v):
future.execute(executor) {
return task(value: result.value!)
}
}
}
}
}
class Promise<T>: Future<T> {
func success(v: T) {
}
func failure(e: NSError) {
}
}
future {
if let cached = self.cachedData() {
cached.success(cachedData)
}
return retriveData(url).flatMap( deserialize($0))
}.onSuccess { items in
self.updateUI(items)
self.cacheItems(items)
}
cached.onSuccess { items in
self.updateUI(items)
}
protocol FlatMappable: Mappable {
init(element: Element)
func flatMap<Out>(transform: Element -> Self<Out>) -> Self<Out>
}
protocol Bindable: Mappable {
init(element: Element)
func bind<Out>(
input: Self<In>,
transform: In -> Self<Out>) -> Self<Out>
}
protocol FlatMappable: Mappable {
func empty() -> m
func flatMap(a -> m b) -> m b
}
Para fins educacionais
protocol ~> class
protocol Concattable {
func empty() -> m
func append(m, m) -> m
func concat([m]) -> m
}
class Monoid m where
mempty :: m
mappend :: m -> m -> m
mconcat :: [m] -> m
Ja falamos de
Monoid
protocol Mappable {
func map(a -> b, Self a) -> Self b
}
class Functor f where
fmap :: (a -> b) -> f a -> f b
Ja falamos de
Monoid
Functor
protocol FlatMappable: Mappable {
func empty() -> m
func flatMap(a -> m b) -> m b
}
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
Ja falamos de
Monoid
Functor
Monad
De modo simples..
protocol ~> class
Concattable ~> Monoid
Mappable ~> Functor
FlatMappable ~> Monad
A monad is just a monoid in the category of endofunctors, what's the
problem?
http://stackoverflow.com/questions/3870088/a-monad-is-just-a-monoid-in-the-
category-of-endofunctors-whats-the-issue
Incompleto: piada criada em “A Brief, Incomplete, and Mostly Wrong History
of Programming Languages”
Qual o problema?
Então, o que é uma Monad?
All told, a monad in X is just a monoid in the category of endofunctors of X,
with product × replaced by composition of endofunctors and unit set by the
identity endofunctor.
A monad is just a monoid in the category of endofunctors, what's the
problem?
Vs
Então, o que é uma Monad?
Uma forma de criar complexidade, partindo de simplicidade
Monads famosas em Haskell (ainda não implementadas em Swift)
• I/O Monad
• State Monad
• Reader/Writer Monad
• Continuation Monad
Outras coisas que podem ser criadas
com monads
• Frameworks reativos
• DSL
• trabalho com coleções (LINQ)
Outras referências
• Finally Understand Monads with this One Weird Trick by Andy Bartholomew
• Monads are Not Monsters by Junior Bontognali
• Don’t Fear the Monads by Bryan Beckman
• Abstraction, intuition, and the “monad tutorial fallacy” by Brent
• Haskell for Mac - App Store
Outras referências
@talesp
tales.andrade@concretesolutions.com.br
Obrigado :)
www.concretesolutions.com.br
blog.concretesolutions.com.br
Rio de Janeiro – Rua São José, 90 – cj. 2121
Centro – (21) 2240-2030
São Paulo - Rua Sansão Alves dos Santos, 433
4º andar - Brooklin - (11) 4119-0449

Más contenido relacionado

La actualidad más candente

14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...Manuel Menezes de Sequeira
 
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutines
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a CoroutinesTDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutines
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutinestdc-globalcode
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sérioLuciano Ramalho
 
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsCurso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsLeonardo Melo Santos
 
Apresentação Design Adaptador
Apresentação Design AdaptadorApresentação Design Adaptador
Apresentação Design Adaptadorrobson santiago
 
Aop Aspect J 1.5.4 Capitulo 04
Aop Aspect J 1.5.4 Capitulo 04Aop Aspect J 1.5.4 Capitulo 04
Aop Aspect J 1.5.4 Capitulo 04Diego Pacheco
 
Curso de OO com C# - Parte 02 - Introdução ao C#
Curso de OO com C# - Parte 02 - Introdução ao C#Curso de OO com C# - Parte 02 - Introdução ao C#
Curso de OO com C# - Parte 02 - Introdução ao C#Leonardo Melo Santos
 
Paradigmas de Linguagens de Programacao - Aula #3
Paradigmas de Linguagens de Programacao - Aula #3Paradigmas de Linguagens de Programacao - Aula #3
Paradigmas de Linguagens de Programacao - Aula #3Ismar Silveira
 
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais) [Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais) Loiane Groner
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Saulo Arruda
 
tmn - Introdução ao JavaScript
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScriptClaudio Gamboa
 
OOP (in portuguese)
OOP (in portuguese)OOP (in portuguese)
OOP (in portuguese)Bruno Pedro
 
Linguagem de Programação Estruturada com Java-Aula2
Linguagem de Programação Estruturada com Java-Aula2Linguagem de Programação Estruturada com Java-Aula2
Linguagem de Programação Estruturada com Java-Aula2Elvis Araújo
 
Programação "Estruturada" com Java
Programação "Estruturada" com JavaProgramação "Estruturada" com Java
Programação "Estruturada" com JavaLuiz Ricardo Silva
 
Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comandogarux
 
Javascript para CSharpers 2 - Functions
Javascript para CSharpers   2 - FunctionsJavascript para CSharpers   2 - Functions
Javascript para CSharpers 2 - FunctionsWesley Lemos
 
Curso de OO com C# - Parte 06 - ADO.NET
Curso de OO com C# - Parte 06 - ADO.NETCurso de OO com C# - Parte 06 - ADO.NET
Curso de OO com C# - Parte 06 - ADO.NETLeonardo Melo Santos
 

La actualidad más candente (20)

14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
 
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutines
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a CoroutinesTDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutines
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutines
 
JavaScript: agora é sério
JavaScript: agora é sérioJavaScript: agora é sério
JavaScript: agora é sério
 
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e StringsCurso de OO com C# - Parte 04 - Estruturas de controle e Strings
Curso de OO com C# - Parte 04 - Estruturas de controle e Strings
 
Aula 4
Aula 4Aula 4
Aula 4
 
Apresentação Design Adaptador
Apresentação Design AdaptadorApresentação Design Adaptador
Apresentação Design Adaptador
 
Aop Aspect J 1.5.4 Capitulo 04
Aop Aspect J 1.5.4 Capitulo 04Aop Aspect J 1.5.4 Capitulo 04
Aop Aspect J 1.5.4 Capitulo 04
 
Curso de OO com C# - Parte 02 - Introdução ao C#
Curso de OO com C# - Parte 02 - Introdução ao C#Curso de OO com C# - Parte 02 - Introdução ao C#
Curso de OO com C# - Parte 02 - Introdução ao C#
 
Paradigmas de Linguagens de Programacao - Aula #3
Paradigmas de Linguagens de Programacao - Aula #3Paradigmas de Linguagens de Programacao - Aula #3
Paradigmas de Linguagens de Programacao - Aula #3
 
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais) [Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
[Curso Java Básico] Aula 13: Operadores (Aritiméticos, Lógicos e Relacionais)
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
tmn - Introdução ao JavaScript
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScript
 
OOP (in portuguese)
OOP (in portuguese)OOP (in portuguese)
OOP (in portuguese)
 
Linguagem de Programação Estruturada com Java-Aula2
Linguagem de Programação Estruturada com Java-Aula2Linguagem de Programação Estruturada com Java-Aula2
Linguagem de Programação Estruturada com Java-Aula2
 
Programação "Estruturada" com Java
Programação "Estruturada" com JavaProgramação "Estruturada" com Java
Programação "Estruturada" com Java
 
Desenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de ComandoDesenvolvimento Rápido de Programas Linha de Comando
Desenvolvimento Rápido de Programas Linha de Comando
 
Javascript para CSharpers 2 - Functions
Javascript para CSharpers   2 - FunctionsJavascript para CSharpers   2 - Functions
Javascript para CSharpers 2 - Functions
 
Curso de OO com C# - Parte 06 - ADO.NET
Curso de OO com C# - Parte 06 - ADO.NETCurso de OO com C# - Parte 06 - ADO.NET
Curso de OO com C# - Parte 06 - ADO.NET
 
Parte1c
Parte1cParte1c
Parte1c
 
Operadores Java
Operadores JavaOperadores Java
Operadores Java
 

Destacado

Gerenciamento de Memória em Swift - The Weak, the Strong, and the Unowned.
Gerenciamento de Memória em Swift - The Weak, the Strong, and the Unowned.Gerenciamento de Memória em Swift - The Weak, the Strong, and the Unowned.
Gerenciamento de Memória em Swift - The Weak, the Strong, and the Unowned.Txai Wieser
 
O usuario esta bebado - UX eh pra todo mundo - 15 min
O usuario esta bebado - UX eh pra todo mundo - 15 minO usuario esta bebado - UX eh pra todo mundo - 15 min
O usuario esta bebado - UX eh pra todo mundo - 15 minAdriano Schmidt
 
Dev e designer em projetos de UX, vai ter briga?!
Dev e designer em projetos de UX, vai ter briga?!Dev e designer em projetos de UX, vai ter briga?!
Dev e designer em projetos de UX, vai ter briga?!Diego Motta
 
TDC Floripa - Trilha iOS - Debate sobre o futuro da plataforma
TDC Floripa - Trilha iOS - Debate sobre o futuro da plataformaTDC Floripa - Trilha iOS - Debate sobre o futuro da plataforma
TDC Floripa - Trilha iOS - Debate sobre o futuro da plataformaDouglas Fischer
 
Sucesso e derrota na Arquitetura Agile
Sucesso e derrota na Arquitetura AgileSucesso e derrota na Arquitetura Agile
Sucesso e derrota na Arquitetura AgileSérgio Giraldo
 
TDC Floripa - Trilha iOS - Mercado iOS no Brasil.
TDC Floripa - Trilha iOS - Mercado iOS no Brasil.TDC Floripa - Trilha iOS - Mercado iOS no Brasil.
TDC Floripa - Trilha iOS - Mercado iOS no Brasil.Douglas Fischer
 
Interfaces Naturais
Interfaces NaturaisInterfaces Naturais
Interfaces NaturaisEdu Agni
 
Entendendo nossos usuários
Entendendo nossos usuáriosEntendendo nossos usuários
Entendendo nossos usuáriosSimone Beltrame
 
TDC2016SP - Como transformar dados em experiência para o usuário
TDC2016SP - Como transformar dados em experiência para o usuárioTDC2016SP - Como transformar dados em experiência para o usuário
TDC2016SP - Como transformar dados em experiência para o usuáriotdc-globalcode
 
HHVM - Entre Nesse Ritmo - TDC Florianopolis 2014
HHVM - Entre Nesse Ritmo - TDC Florianopolis 2014HHVM - Entre Nesse Ritmo - TDC Florianopolis 2014
HHVM - Entre Nesse Ritmo - TDC Florianopolis 2014Levi Ferreira
 
TDC2016SP - Medição de Diversão a Partir da Face no Apoio ao Game Design
TDC2016SP - Medição de Diversão a Partir da Face no Apoio ao Game DesignTDC2016SP - Medição de Diversão a Partir da Face no Apoio ao Game Design
TDC2016SP - Medição de Diversão a Partir da Face no Apoio ao Game Designtdc-globalcode
 
TDC2016SP - Buscas inteligentes para emegencias hospitalares
TDC2016SP - Buscas inteligentes para emegencias hospitalaresTDC2016SP - Buscas inteligentes para emegencias hospitalares
TDC2016SP - Buscas inteligentes para emegencias hospitalarestdc-globalcode
 
TDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQLTDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQLtdc-globalcode
 
TDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQLTDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQLtdc-globalcode
 
TDC2016SP - Trilha DevOps Java
TDC2016SP - Trilha DevOps JavaTDC2016SP - Trilha DevOps Java
TDC2016SP - Trilha DevOps Javatdc-globalcode
 
TDC2016SP - Trilha Management 3.0
TDC2016SP - Trilha Management 3.0TDC2016SP - Trilha Management 3.0
TDC2016SP - Trilha Management 3.0tdc-globalcode
 
TDC2016SP - Trilha Data Science
TDC2016SP - Trilha Data ScienceTDC2016SP - Trilha Data Science
TDC2016SP - Trilha Data Sciencetdc-globalcode
 

Destacado (20)

Gerenciamento de Memória em Swift - The Weak, the Strong, and the Unowned.
Gerenciamento de Memória em Swift - The Weak, the Strong, and the Unowned.Gerenciamento de Memória em Swift - The Weak, the Strong, and the Unowned.
Gerenciamento de Memória em Swift - The Weak, the Strong, and the Unowned.
 
Devs dando pitacos
Devs dando pitacosDevs dando pitacos
Devs dando pitacos
 
O usuario esta bebado - UX eh pra todo mundo - 15 min
O usuario esta bebado - UX eh pra todo mundo - 15 minO usuario esta bebado - UX eh pra todo mundo - 15 min
O usuario esta bebado - UX eh pra todo mundo - 15 min
 
Dev e designer em projetos de UX, vai ter briga?!
Dev e designer em projetos de UX, vai ter briga?!Dev e designer em projetos de UX, vai ter briga?!
Dev e designer em projetos de UX, vai ter briga?!
 
TDC Floripa - Trilha iOS - Debate sobre o futuro da plataforma
TDC Floripa - Trilha iOS - Debate sobre o futuro da plataformaTDC Floripa - Trilha iOS - Debate sobre o futuro da plataforma
TDC Floripa - Trilha iOS - Debate sobre o futuro da plataforma
 
Sucesso e derrota na Arquitetura Agile
Sucesso e derrota na Arquitetura AgileSucesso e derrota na Arquitetura Agile
Sucesso e derrota na Arquitetura Agile
 
Sketch andzeplin
Sketch andzeplinSketch andzeplin
Sketch andzeplin
 
TDC Floripa - Trilha iOS - Mercado iOS no Brasil.
TDC Floripa - Trilha iOS - Mercado iOS no Brasil.TDC Floripa - Trilha iOS - Mercado iOS no Brasil.
TDC Floripa - Trilha iOS - Mercado iOS no Brasil.
 
Interfaces Naturais
Interfaces NaturaisInterfaces Naturais
Interfaces Naturais
 
Entendendo nossos usuários
Entendendo nossos usuáriosEntendendo nossos usuários
Entendendo nossos usuários
 
A Gradle Story
A Gradle StoryA Gradle Story
A Gradle Story
 
TDC2016SP - Como transformar dados em experiência para o usuário
TDC2016SP - Como transformar dados em experiência para o usuárioTDC2016SP - Como transformar dados em experiência para o usuário
TDC2016SP - Como transformar dados em experiência para o usuário
 
HHVM - Entre Nesse Ritmo - TDC Florianopolis 2014
HHVM - Entre Nesse Ritmo - TDC Florianopolis 2014HHVM - Entre Nesse Ritmo - TDC Florianopolis 2014
HHVM - Entre Nesse Ritmo - TDC Florianopolis 2014
 
TDC2016SP - Medição de Diversão a Partir da Face no Apoio ao Game Design
TDC2016SP - Medição de Diversão a Partir da Face no Apoio ao Game DesignTDC2016SP - Medição de Diversão a Partir da Face no Apoio ao Game Design
TDC2016SP - Medição de Diversão a Partir da Face no Apoio ao Game Design
 
TDC2016SP - Buscas inteligentes para emegencias hospitalares
TDC2016SP - Buscas inteligentes para emegencias hospitalaresTDC2016SP - Buscas inteligentes para emegencias hospitalares
TDC2016SP - Buscas inteligentes para emegencias hospitalares
 
TDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQLTDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQL
 
TDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQLTDC2016SP - Trilha NoSQL
TDC2016SP - Trilha NoSQL
 
TDC2016SP - Trilha DevOps Java
TDC2016SP - Trilha DevOps JavaTDC2016SP - Trilha DevOps Java
TDC2016SP - Trilha DevOps Java
 
TDC2016SP - Trilha Management 3.0
TDC2016SP - Trilha Management 3.0TDC2016SP - Trilha Management 3.0
TDC2016SP - Trilha Management 3.0
 
TDC2016SP - Trilha Data Science
TDC2016SP - Trilha Data ScienceTDC2016SP - Trilha Data Science
TDC2016SP - Trilha Data Science
 

Similar a Monads, Functors e Módulos em Swift

Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFutureHelder da Rocha
 
F sharp e o paradigma funcional
F sharp e o paradigma funcionalF sharp e o paradigma funcional
F sharp e o paradigma funcionalEvandro Souza
 
Scala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosScala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosFelipe Hummel
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasÉverton Ribeiro
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Pythonguestac3de
 
Programação Orientada por Objectos - Aula 4
Programação Orientada por Objectos - Aula 4Programação Orientada por Objectos - Aula 4
Programação Orientada por Objectos - Aula 4guestd521d1f
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturadadiogoa21
 
Curso de Matlab avancado 2
Curso de Matlab avancado 2Curso de Matlab avancado 2
Curso de Matlab avancado 2Gabriel Costa
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9Nando Vieira
 
Aula01
Aula01Aula01
Aula01vdlos
 

Similar a Monads, Functors e Módulos em Swift (20)

Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
F sharp e o paradigma funcional
F sharp e o paradigma funcionalF sharp e o paradigma funcional
F sharp e o paradigma funcional
 
Scala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosScala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetos
 
Funções e procedimentos
Funções e procedimentosFunções e procedimentos
Funções e procedimentos
 
Ruby e Erlang de mãos dadas
Ruby e Erlang de mãos dadasRuby e Erlang de mãos dadas
Ruby e Erlang de mãos dadas
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Python
 
Monadic Design
Monadic DesignMonadic Design
Monadic Design
 
Programação Orientada por Objectos - Aula 4
Programação Orientada por Objectos - Aula 4Programação Orientada por Objectos - Aula 4
Programação Orientada por Objectos - Aula 4
 
Programação Orientada por Objectos - Aula 4
Programação Orientada por Objectos - Aula 4Programação Orientada por Objectos - Aula 4
Programação Orientada por Objectos - Aula 4
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
2006 - Linguagem VB.ppt
2006 - Linguagem VB.ppt2006 - Linguagem VB.ppt
2006 - Linguagem VB.ppt
 
M2ti - Python Brasil
M2ti - Python BrasilM2ti - Python Brasil
M2ti - Python Brasil
 
Curso de Matlab avancado 2
Curso de Matlab avancado 2Curso de Matlab avancado 2
Curso de Matlab avancado 2
 
11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf11-codigo-limpo-parte-4.pdf
11-codigo-limpo-parte-4.pdf
 
Aula 1 | Introdução a C++
Aula 1 | Introdução a C++Aula 1 | Introdução a C++
Aula 1 | Introdução a C++
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Funções em C
Funções em CFunções em C
Funções em C
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
Aula01
Aula01Aula01
Aula01
 

Más de Tales Andrade

Debugging tips and tricks - coders on beers Santiago
Debugging tips and tricks -  coders on beers SantiagoDebugging tips and tricks -  coders on beers Santiago
Debugging tips and tricks - coders on beers SantiagoTales Andrade
 
Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Tales Andrade
 
Delegateless Coordinator
Delegateless CoordinatorDelegateless Coordinator
Delegateless CoordinatorTales Andrade
 
Swift na linha de comando
Swift na linha de comandoSwift na linha de comando
Swift na linha de comandoTales Andrade
 
Swift!.opcionais.oh!.my()?!?
Swift!.opcionais.oh!.my()?!?Swift!.opcionais.oh!.my()?!?
Swift!.opcionais.oh!.my()?!?Tales Andrade
 
Debugging fast track
Debugging fast trackDebugging fast track
Debugging fast trackTales Andrade
 

Más de Tales Andrade (7)

Debugging tips and tricks - coders on beers Santiago
Debugging tips and tricks -  coders on beers SantiagoDebugging tips and tricks -  coders on beers Santiago
Debugging tips and tricks - coders on beers Santiago
 
Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Delegateless Coordinators - take 2
Delegateless Coordinators - take 2
 
Delegateless Coordinator
Delegateless CoordinatorDelegateless Coordinator
Delegateless Coordinator
 
Swift na linha de comando
Swift na linha de comandoSwift na linha de comando
Swift na linha de comando
 
Swift!.opcionais.oh!.my()?!?
Swift!.opcionais.oh!.my()?!?Swift!.opcionais.oh!.my()?!?
Swift!.opcionais.oh!.my()?!?
 
Debugging fast track
Debugging fast trackDebugging fast track
Debugging fast track
 
Tales@tdc
Tales@tdcTales@tdc
Tales@tdc
 

Último

Tecnólogo em Mecatrônica - Universidade Anhanguera
Tecnólogo em Mecatrônica - Universidade AnhangueraTecnólogo em Mecatrônica - Universidade Anhanguera
Tecnólogo em Mecatrônica - Universidade AnhangueraGuilhermeLucio9
 
LEAN SIX SIGMA - Garantia da qualidade e segurança
LEAN SIX SIGMA - Garantia da qualidade e segurançaLEAN SIX SIGMA - Garantia da qualidade e segurança
LEAN SIX SIGMA - Garantia da qualidade e segurançaGuilhermeLucio9
 
Aulas Práticas da Disciplina de Desenho Técnico Projetivo _ Passei Direto.pdf
Aulas Práticas da Disciplina de Desenho Técnico Projetivo _ Passei Direto.pdfAulas Práticas da Disciplina de Desenho Técnico Projetivo _ Passei Direto.pdf
Aulas Práticas da Disciplina de Desenho Técnico Projetivo _ Passei Direto.pdfMateusSerraRodrigues1
 
PLANO DE EMERGÊNCIA E COMBATE A INCENDIO.pdf
PLANO DE EMERGÊNCIA E COMBATE A INCENDIO.pdfPLANO DE EMERGÊNCIA E COMBATE A INCENDIO.pdf
PLANO DE EMERGÊNCIA E COMBATE A INCENDIO.pdfAroldoMenezes1
 
Eletricista instalador - Senai Almirante Tamandaré
Eletricista instalador - Senai Almirante TamandaréEletricista instalador - Senai Almirante Tamandaré
Eletricista instalador - Senai Almirante TamandaréGuilhermeLucio9
 
Estatística aplicada à experimentação animal
Estatística aplicada à experimentação animalEstatística aplicada à experimentação animal
Estatística aplicada à experimentação animalleandroladesenvolvim
 
Resistencias dos materiais I - Tensao.pptx
Resistencias dos materiais I - Tensao.pptxResistencias dos materiais I - Tensao.pptx
Resistencias dos materiais I - Tensao.pptxjuliocameloUFC
 
MODELO LAUDO AVALIAÇÃO MÁQUINAS EQUIPAM
MODELO LAUDO AVALIAÇÃO MÁQUINAS  EQUIPAMMODELO LAUDO AVALIAÇÃO MÁQUINAS  EQUIPAM
MODELO LAUDO AVALIAÇÃO MÁQUINAS EQUIPAMCassio Rodrigo
 
FISIOLOGIA DA REPRODUÇÃO. matéria de fisiologia animal
FISIOLOGIA DA REPRODUÇÃO. matéria de fisiologia animalFISIOLOGIA DA REPRODUÇÃO. matéria de fisiologia animal
FISIOLOGIA DA REPRODUÇÃO. matéria de fisiologia animalPauloHenrique154965
 

Último (9)

Tecnólogo em Mecatrônica - Universidade Anhanguera
Tecnólogo em Mecatrônica - Universidade AnhangueraTecnólogo em Mecatrônica - Universidade Anhanguera
Tecnólogo em Mecatrônica - Universidade Anhanguera
 
LEAN SIX SIGMA - Garantia da qualidade e segurança
LEAN SIX SIGMA - Garantia da qualidade e segurançaLEAN SIX SIGMA - Garantia da qualidade e segurança
LEAN SIX SIGMA - Garantia da qualidade e segurança
 
Aulas Práticas da Disciplina de Desenho Técnico Projetivo _ Passei Direto.pdf
Aulas Práticas da Disciplina de Desenho Técnico Projetivo _ Passei Direto.pdfAulas Práticas da Disciplina de Desenho Técnico Projetivo _ Passei Direto.pdf
Aulas Práticas da Disciplina de Desenho Técnico Projetivo _ Passei Direto.pdf
 
PLANO DE EMERGÊNCIA E COMBATE A INCENDIO.pdf
PLANO DE EMERGÊNCIA E COMBATE A INCENDIO.pdfPLANO DE EMERGÊNCIA E COMBATE A INCENDIO.pdf
PLANO DE EMERGÊNCIA E COMBATE A INCENDIO.pdf
 
Eletricista instalador - Senai Almirante Tamandaré
Eletricista instalador - Senai Almirante TamandaréEletricista instalador - Senai Almirante Tamandaré
Eletricista instalador - Senai Almirante Tamandaré
 
Estatística aplicada à experimentação animal
Estatística aplicada à experimentação animalEstatística aplicada à experimentação animal
Estatística aplicada à experimentação animal
 
Resistencias dos materiais I - Tensao.pptx
Resistencias dos materiais I - Tensao.pptxResistencias dos materiais I - Tensao.pptx
Resistencias dos materiais I - Tensao.pptx
 
MODELO LAUDO AVALIAÇÃO MÁQUINAS EQUIPAM
MODELO LAUDO AVALIAÇÃO MÁQUINAS  EQUIPAMMODELO LAUDO AVALIAÇÃO MÁQUINAS  EQUIPAM
MODELO LAUDO AVALIAÇÃO MÁQUINAS EQUIPAM
 
FISIOLOGIA DA REPRODUÇÃO. matéria de fisiologia animal
FISIOLOGIA DA REPRODUÇÃO. matéria de fisiologia animalFISIOLOGIA DA REPRODUÇÃO. matéria de fisiologia animal
FISIOLOGIA DA REPRODUÇÃO. matéria de fisiologia animal
 

Monads, Functors e Módulos em Swift

  • 1.
  • 2. Quem sou eu • Mestre em Computação pelo IME-USP • Desenvolvedor C desde 2002 • Objective-C desde 2007 (coisas básicas em Mac OS X antes do iPhone!) • iOS desde 2010 • Swift desde Agosto/2015 • Tech Lead na Concrete Solutions (estamos contratando) • Organizador do CocoaHeads SP • Colaborador do CocoaHeads BR • Colaborador da Embaixada Brasileira de Appsterdam
  • 3. Compartilhando código e dependências entre plataformas Escrevendo uma vez e reutilizando em iOS, tvOS, watchOS, macOS 😂
  • 5. Como alterei o tema da minha palestra E esqueci de enviar a atualização
  • 6. Usando POP com Programação Funcional Como entender algumas abstrações usando Protocol Oriented Programming
  • 7. A Formula • Descreva em linguagem natural • Escreva a assinatura do tipo • Implemente a logica • Teste seu código (não necessariamente nessa ordem)
  • 8. O que é programação funcional? • Estilo de programação • First Class Functions • Modularização • Efeitos colaterais • Imutabilidade
  • 9. O que é programação funcional? A monad is just a monoid in the category of endofunctors, what's the problem? Crockford’s Law In addition to its being good and useful, it's also cursed. The curse of the monad is that once you get the epiphany, once you understand oh, that's what it is, you lose the ability to explain it to anybody else.
  • 11. protocol Concattable { init() func +(left: Self, right: Self) -> Self static func concat(list: [Self]) -> Self }
  • 12. extension Concattable { static func concat(list: [Self]) -> Self { return list.reduce(Self(), combine: +) } }
  • 13. extension Int: Concattable {} extension Float: Concattable {} extension String: Concattable {} extension Array: Concattable {}
  • 14. func +<T>(left: Set<T>, right: Set<T>) -> Set<T> { return left.union(right) } func +(left: Bool, right: Bool) -> Bool { return left || right }
  • 15. func +<Key, Value>(inout left: Dictionary<Key, Value>, right:Dictionary<Key, Value>) -> Dictionary<Key, Value> { for (key, value) in right { left.updateValue(value, forKey: key) } }
  • 16. protocol Concattable { init() func +(left: Self, right: Self) -> Self static func concat(list: [Self]) -> Self }
  • 17. protocol Concattable { init() static func concat(left: Self, right: Self) -> Self static func concat(list: [Self]) -> Self }
  • 18. protocol Concattable { func makeEmpty() -> Self func concat(left: Self, right: Self) -> Self func concat(list: [Self]) -> Self }
  • 19. protocol Concattable { static func empty() -> Self static func append(left: Self, right: Self) -> Self static func concat(list: [Self]) -> Self }
  • 20. protocol Concattable { static func empty() -> Self static func append(Self, Self) -> Self static func concat([Self]) -> Self }
  • 21. protocol Concattable { static func empty() -> m static func append(m, m) -> m static func concat([m]) -> m }
  • 22. protocol Mappable { associatedtype Element func map<OutType>(transform: Element -> OutType) -> Self<OutType> }
  • 23. protocol Mappable { associatedtype Element static func map<OutType, OutMappable: Mappable where Element == OutType>( transform: (Element -> OutType) ) -> OutMappable }
  • 24. extension Array: Mappable { func map<OutType>(transform: (Element -> OutType)) -> [OutType] { var result = Array<OutType>() for e in self { result.append(transform(e)) } return result } }
  • 25. enum Result<ValueType>: Mappable { case Failure(error: ErrorType) case Success(value: ValueType) func map<OutType>(transform: ValueType -> OutType) -> Result<OutType> { switch self { case .Failure(let error): return .Failure(error) case .Success(let value): return .Success(value: transform(value)) } } }
  • 26. protocol Mappable { associatedtype Element func map<OutType, OutMappable: Mappable where Element == OutType>( transform: (Element -> OutType) ) -> OutMappable }
  • 27. protocol Mappable { associatedtype Element func map<A, B>(transform: A -> B, input: Self<A>) -> Self<B> }
  • 28. protocol Mappable { func map(transform: a -> b, input: Self a) -> Self b }
  • 29. protocol Mappable { func map(a -> b, Self a) -> Self b }
  • 30. protocol FlatMappable: Mappable { init(element: Element) func flatMap<Out>(transform: Element -> Self<Out>) -> Self<Out> }
  • 31. protocol FlatMappable: Mappable { init(element: Element) func flatMap<OutType, OutMappable: FlatMappable where Element == OutType>( transform: Element -> OutType) -> OutMappable }
  • 32. extension Optional: FlatMappable { typealias Element = Wrapped func flatMap<Out>(transform: Wrapped -> Optional<Out>) -> Optional<Out> { switch self { case .None: return nil case .Some(let value): return transform(value) } } }
  • 33. Futures e Promises Future - objeto mantendo um valor que pode estar disponível em algum momento • se o bloco de execução não terminou, dizemos que o Future ainda não terminou • ao completar a execução, temos um valor ou um erro - Result FTW Promise - “extensão” do Future • Pode retornar um Future • Promise pode não completar/executar • read/write
  • 34. Futures Future precisa de: • Contexto de execução • Tarefa a ser executada
  • 35. class Future<T> { typealias Runnable = () -> Result<T> typealias OnSuccessCallBack = (T) -> () typealias OnFailueCallBack = (NSError) -> () typealias OnComplete = (result: Result<T>) - //wrapper de dispatch_queue_t > () let extension: ExecutionContext var result: Result<T>? = nil { didSet { self.performCallbacks() } } }
  • 36. extension Future { func then<U>(executor: ExecutionContext = ExecutionContext.defaultContext, task: (value: T) -> Result<U>) -> Future<U> { let future = Future<U>() self.onComplete() { result in switch result { case .Error(let e): syncronized(future) { future.result = Result<U>(e) } case .Value(let v): future.execute(executor) { return task(value: result.value!) } } } } }
  • 37. class Promise<T>: Future<T> { func success(v: T) { } func failure(e: NSError) { } }
  • 38. future { if let cached = self.cachedData() { cached.success(cachedData) } return retriveData(url).flatMap( deserialize($0)) }.onSuccess { items in self.updateUI(items) self.cacheItems(items) } cached.onSuccess { items in self.updateUI(items) }
  • 39. protocol FlatMappable: Mappable { init(element: Element) func flatMap<Out>(transform: Element -> Self<Out>) -> Self<Out> }
  • 40. protocol Bindable: Mappable { init(element: Element) func bind<Out>( input: Self<In>, transform: In -> Self<Out>) -> Self<Out> }
  • 41. protocol FlatMappable: Mappable { func empty() -> m func flatMap(a -> m b) -> m b }
  • 43. protocol Concattable { func empty() -> m func append(m, m) -> m func concat([m]) -> m }
  • 44. class Monoid m where mempty :: m mappend :: m -> m -> m mconcat :: [m] -> m
  • 46. protocol Mappable { func map(a -> b, Self a) -> Self b }
  • 47. class Functor f where fmap :: (a -> b) -> f a -> f b
  • 49. protocol FlatMappable: Mappable { func empty() -> m func flatMap(a -> m b) -> m b }
  • 50. class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b
  • 52. De modo simples.. protocol ~> class Concattable ~> Monoid Mappable ~> Functor FlatMappable ~> Monad
  • 53. A monad is just a monoid in the category of endofunctors, what's the problem? http://stackoverflow.com/questions/3870088/a-monad-is-just-a-monoid-in-the- category-of-endofunctors-whats-the-issue Incompleto: piada criada em “A Brief, Incomplete, and Mostly Wrong History of Programming Languages” Qual o problema?
  • 54. Então, o que é uma Monad? All told, a monad in X is just a monoid in the category of endofunctors of X, with product × replaced by composition of endofunctors and unit set by the identity endofunctor. A monad is just a monoid in the category of endofunctors, what's the problem? Vs
  • 55. Então, o que é uma Monad? Uma forma de criar complexidade, partindo de simplicidade Monads famosas em Haskell (ainda não implementadas em Swift) • I/O Monad • State Monad • Reader/Writer Monad • Continuation Monad
  • 56. Outras coisas que podem ser criadas com monads • Frameworks reativos • DSL • trabalho com coleções (LINQ)
  • 57. Outras referências • Finally Understand Monads with this One Weird Trick by Andy Bartholomew • Monads are Not Monsters by Junior Bontognali • Don’t Fear the Monads by Bryan Beckman • Abstraction, intuition, and the “monad tutorial fallacy” by Brent • Haskell for Mac - App Store
  • 59. www.concretesolutions.com.br blog.concretesolutions.com.br Rio de Janeiro – Rua São José, 90 – cj. 2121 Centro – (21) 2240-2030 São Paulo - Rua Sansão Alves dos Santos, 433 4º andar - Brooklin - (11) 4119-0449

Notas del editor

  1. API guidelines: evite termos obscuros e nomeie habilidades com sufixo “able” operadores dentro de protocolos são estáticos
  2. aplicar a inteiros e floats soma os valores. Em strings o conteúdo é concatenado. Em arrays os novos valores são adicionados no fim do array
  3. API guidelines: evite termos obscuros e nomeie habilidades com sufixo “able” operadores dentro de protocolos são estáticos
  4. init constroi uma nova instancia vazia,
  5. pra evitar ambiguidade, renomeados o primeiro concat
  6. append não é muito bom, indica mutabilidade
  7. esse código derruba o compilador :(
  8. não compila :(
  9. encadeamento
  10. para fins educacionais…
  11. flatmappable -> bindable flatmap -> bind
  12. flatmappable -> bindable flatmap -> bind
  13. endofunctor é um functor com algumas regras adicionais X é uma categoria
  14. I/O - controla efeito colateral no IO (disco, rede, etc) - puramente funcional State - maquina de estados com efeitos intermediários Writer ~ Log - resultado+valor associado Reader ~ Continuation ~ controla “efeito colateral” em callbacks
  15. I/O - controla efeito colateral no IO (disco, rede, etc) - puramente funcional State - maquina de estados com efeitos intermediários Writer ~ Log - resultado+valor associado Reader ~ Continuation ~ controla “efeito colateral” em callbacks
  16. I/O - controla efeito colateral no IO (disco, rede, etc) - puramente funcional State - maquina de estados com efeitos intermediários Writer ~ Log - resultado+valor associado Reader ~ Continuation ~ controla “efeito colateral” em callbacks
  17. I/O - controla efeito colateral no IO (disco, rede, etc) - puramente funcional State - maquina de estados com efeitos intermediários Writer ~ Log - resultado+valor associado Reader ~ Continuation ~ controla “efeito colateral” em callbacks