2. Pedro Castilho
(Unicórnios são muito importantes
na programação funcional)
• 9˚ período de EC (tecnicamente)
• Viciado em programação funcional
• Lisper desde 2011
• Ex-monitor de PLC
8. Roteiro
• O que é programação funcional?
• Por que programação funcional importa?
• Programando funcionalmente na prática
9. Roteiro
• O que é programação funcional?
• Por que programação funcional importa?
• Programando funcionalmente na prática
10. O que a maioria das pessoas espera
1 (defn (assign-cluster pt centres)
2 (let* ((distances (map
3 (lambda (centre) (euclidean-distance centre pt))
4 centres))
5 (smallest (apply min distances)))
6 (list-index (lambda (d) (= d smallest)) distances)))
11. O que a maioria das pessoas espera
1 kMeansPP :: MonadRandom m => Int -> [Vec] -> m [Cluster]
2 kMeansPP n pts = kMeansIteration pts <$> centroids
3 where centroids = iterate (>>= nextCentroid) x0 !! (n-1)
4 x0 = take 1 <$> randomElements pts
5 nextCentroid cs = (: cs) <$> fromList (map (weight cs) pts)
6 weight cs x = (x, toRational $ distance x (cs `nearestTo` x))
13. Você NÃO precisa:
• Ser um “monstro" da programação
• Saber matemática complexa
• Saber uma linguagem funcional
• Ter cursado PLC
• Saber usar Monads
24. Funções de Primeira Classe
• Podem ser guardadas em variáveis
• Podem ser passadas como argumentos
• Podem ser retornadas de funções
• Compõem comportamentos complexos
26. Funções de Primeira Classe Fundamentais
• map: Transforma cada elemento de uma lista/array
• filter: Remove elementos de uma lista/array
• reduce: Produz um resultado agregado de uma lista/array
33. Funções de Primeira Classe Fundamentais
reduce(f, z, l)
resultado =
f =
l =
z =
34. Funções de Primeira Classe Fundamentais
reduce(f, z, l)
resultado =
f =
l =
z =
35. Funções de Primeira Classe Fundamentais
reduce(f, z, l)
resultado =
f =
l =
z =
36. Funções de Primeira Classe Fundamentais
• Disponíveis em quase qualquer linguagem hoje
• Em C#: Usando LINQ
• Em Java: Usando Streams
• Em Python: Parte da biblioteca padrão
40. 1 let nums = Array<Int>(1...10)
2 let qnums = nums.map({ i in String(i * i) })
3 print(", ".join(qnums))
4 let tnums = nums.map({ i in String(i * 3) })
5 print(", ".join(tnums))