Programação funcional em Swift
-
Upload
vinicius-soares-lima -
Category
Software
-
view
380 -
download
1
Transcript of Programação funcional em Swift
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