Programação
funcional em Swift
Mas…
O que é Programação
funcional?
"Programação funcional é um paradigma
de programação que visa tratar a
computação como avaliação de funções
matemáticas…" - Wikipedia (tradução livre)
Para programarmos usando esse
paradigma então temos de :
- tratar funções como equações
matemáticas…
- evitar mudança de estado…
- evitar dados mutáveis…
- programação funcional não deve
ter efeitos colaterais... ou seja
não alteram o mundo a sua volta...
Nos queremos somar o array no total…
var total = 0
let array = [0,1,2,3,4,5,6,7,8,9,10]
func add(){
for item in array{
total = total + item
}
}
add()
//total = 55
Quando temos de usar essa função mais
de uma vez o q ela faz?
add()
//total = 55
add()
//total = 110
add()
//total = 165
O problema é que
estamos alterando um
estado global…
Como seria uma forma funcional de
fazer isso?
func addfunctional(array:[Int]) ->Int
{
// uma forma reduzida é
// return array.reduce(0,combine: +)
return array.reduce(0){ total ,
number in total + number}
}
Usando varias vezes vc tem sempre o
mesmo resultado, quando a entrada é a
mesma…
addfunctional(array)
55
addfunctional(array)
55
addfunctional(array)
55
Map, Filter, Reduce….
O que são?
Map
Map é indicado quando vc precisa
transformar um array… ele mapeia uma
coleção e faz alguma coisa…
let array = [0,1,2,3,4,5,6,7,8,9,10]
let stringarray = array.map{
"($0)"
}
//[“0”,”1”,"2","3","4","5","6","7","8","9","10"]
Podemos usar funções também…
func square(x:Int) -> Int{
return x * x
}
let tot = array.map(square)
//[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Filter
O filter filtra um array retornando
um novo array com os elementos que
passam no teste.
let filterarray = array.filter{$0 >
5}
//filterarray = [6, 7, 8, 9, 10]
podemos usar também funções que
retornam bool…
func passaAlto(x:Int) -> Bool{
return x > 5
}
let filterarray2 =
array.filter(passaAlto)
//filterarray2 = [6, 7, 8, 9, 10]
Reduce
O reduce parte de um principio que é
modificado a cada passo do array.
Ele retorna o resultado da passagem
por todos os elementos.
let arrayreduce = array.reduce(0,
combine: +)
//55
É possível também usar da seguinte
forma, para usar funções no lugar de
operadores…
let arrayreduce2 = array.reduce(0)
{ (total, number) in total +
square(number) }
//385
Podemos usa-los juntos!!
let filterarray = array.filter{$0 > 5}
//filterarray = [6, 7, 8, 9, 10]
let filterarray = array.filter{$0 >
5}.map(square)
//filterarray = [36, 49, 64, 81, 100]
let filterarray = array.filter {$0 >
5}.map(square).reduce(0, combine: +)
//filterarray = 330
Praticamente todos os tipos
são tipos de variáveis.
Classes são excessão…
Um enum pode ser usado como varivel e testado
em um switch…
enum Result {
case Success(AnyObject)
case Failure(NSError)
}
func dividir(x:Int, y:Int) -> Result{
if y<1 {
return Result.Failure(NSError(domain:
"divide0", code: 1, userInfo: nil))
}
return Result.Success(x / y)
}
let result = dividir(1000, y: 2)
switch result {
case .Success(let mystuff):
let march = mystuff as! Int + 10 //
510
case .Failure(let error):
error
}
Curried functions…
Como isso funciona?? não sei, mas
funciona assim XD
func add(x: Int) ->Int ->Int {
return {y in return x + y}
}
let sum = add(2) // Int -> Int
let boom = sum(4) // 6
let things = add(10)(12) // 22
Obrigado
Vinicius Lima
@vnmontanhavn
vinicius.lima@concretetesolutions.com

Programação funcional em Swift

  • 1.
  • 2.
    Mas… O que éProgramação funcional?
  • 3.
    "Programação funcional éum paradigma de programação que visa tratar a computação como avaliação de funções matemáticas…" - Wikipedia (tradução livre)
  • 4.
    Para programarmos usandoesse paradigma então temos de : - tratar funções como equações matemáticas… - evitar mudança de estado… - evitar dados mutáveis… - programação funcional não deve ter efeitos colaterais... ou seja não alteram o mundo a sua volta...
  • 6.
    Nos queremos somaro array no total… var total = 0 let array = [0,1,2,3,4,5,6,7,8,9,10] func add(){ for item in array{ total = total + item } } add() //total = 55
  • 7.
    Quando temos deusar essa função mais de uma vez o q ela faz? add() //total = 55 add() //total = 110 add() //total = 165
  • 8.
    O problema éque estamos alterando um estado global…
  • 9.
    Como seria umaforma funcional de fazer isso? func addfunctional(array:[Int]) ->Int { // uma forma reduzida é // return array.reduce(0,combine: +) return array.reduce(0){ total , number in total + number} }
  • 10.
    Usando varias vezesvc tem sempre o mesmo resultado, quando a entrada é a mesma… addfunctional(array) 55 addfunctional(array) 55 addfunctional(array) 55
  • 12.
  • 13.
  • 14.
    Map é indicadoquando vc precisa transformar um array… ele mapeia uma coleção e faz alguma coisa… let array = [0,1,2,3,4,5,6,7,8,9,10] let stringarray = array.map{ "($0)" } //[“0”,”1”,"2","3","4","5","6","7","8","9","10"]
  • 15.
    Podemos usar funçõestambém… func square(x:Int) -> Int{ return x * x } let tot = array.map(square) //[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  • 16.
  • 17.
    O filter filtraum array retornando um novo array com os elementos que passam no teste. let filterarray = array.filter{$0 > 5} //filterarray = [6, 7, 8, 9, 10]
  • 18.
    podemos usar tambémfunções que retornam bool… func passaAlto(x:Int) -> Bool{ return x > 5 } let filterarray2 = array.filter(passaAlto) //filterarray2 = [6, 7, 8, 9, 10]
  • 19.
  • 20.
    O reduce partede um principio que é modificado a cada passo do array. Ele retorna o resultado da passagem por todos os elementos. let arrayreduce = array.reduce(0, combine: +) //55
  • 21.
    É possível tambémusar da seguinte forma, para usar funções no lugar de operadores… let arrayreduce2 = array.reduce(0) { (total, number) in total + square(number) } //385
  • 22.
  • 23.
    let filterarray =array.filter{$0 > 5} //filterarray = [6, 7, 8, 9, 10] let filterarray = array.filter{$0 > 5}.map(square) //filterarray = [36, 49, 64, 81, 100] let filterarray = array.filter {$0 > 5}.map(square).reduce(0, combine: +) //filterarray = 330
  • 24.
    Praticamente todos ostipos são tipos de variáveis. Classes são excessão…
  • 25.
    Um enum podeser usado como varivel e testado em um switch… enum Result { case Success(AnyObject) case Failure(NSError) } func dividir(x:Int, y:Int) -> Result{ if y<1 { return Result.Failure(NSError(domain: "divide0", code: 1, userInfo: nil)) } return Result.Success(x / y) }
  • 26.
    let result =dividir(1000, y: 2) switch result { case .Success(let mystuff): let march = mystuff as! Int + 10 // 510 case .Failure(let error): error }
  • 27.
  • 28.
    Como isso funciona??não sei, mas funciona assim XD func add(x: Int) ->Int ->Int { return {y in return x + y} } let sum = add(2) // Int -> Int let boom = sum(4) // 6 let things = add(10)(12) // 22
  • 29.