SlideShare une entreprise Scribd logo
1  sur  41
2016 is coming....
Monadic Design

Functional Programming
Quem sou eu?
•   Rodrigo Vidal
•   MVP de F#
•   Rio de Janeiro
•   Computação Científica / Engenharia
Agenda




   Composição
Linguagens
12



                      C#, VB,
             10
                       Java         LINQ       F#       Nirvana


              8




Usefulness    6                                                        C#
                                                                       Nirvana
                                                                       Haskell
              4
                                                                       LINQ


              2
                                                        Haskell

              0
                  0      2      4          6        8      10     12


                                       Safety
Programação Funcional
•   Imutabilidade
•   First-class Functions
•   Lazy
•   Pattern Matching
•   Composição
Transparência Referencial

void Multiplicar(Matriz m1, Matriz m2)
{
     ....
}
Efeitos Colaterais
String Nome(Person p)
{
      C.WriteLine(“Isto é um efeito colateral!”);
      return p.Nome;
}
Aplicação Parcial
• Aplicação parcial envolve passar menos
  argumentos para uma função que recebe
  múltiplos argumentos

add :: Int -> Int -> Int
add x y = x + y
addOne = add 1
Currying
Currying é o processo de transformar uma função
que recebe multiplos argumentos para uma função
que recebe somente um argumento e retorna uma
outra função se algum paramêtro ainda for
necessário.

f :: a -> b -> c
É a forma ”curried” de
g :: (a, b) -> c
Funções de Alta Ordem
•   Filter          •   First
•   Map             •   Last
•   Length          •   Zip
•   All             •   Take
•   Any             •   TakeWhile
•   Max
•   Min
Composição de Funções

f(g(x))        g(x)




g >> f
f.g                   f(x)
A Essência do LINQ
O tipo Option
Destilando o LINQ
• IEnumerator<T> == Func<Option<T>>

• () –> Option<T>

• IEnumerable<T> == Func<Func<Option<T>>>

• () –> (() –> Option<T>)
Empty<T>()
Return<T>()
static Func<Func<Option<T>>> Return<T> (T value)
{
return () => {
        int i = 0;
        return () =>
                i++ == 0
                ? (Option<T>)new Option<T>.Some(value)
                : (Option<T>)new Option<T>.None();
        };
 }
Select<T>
Where<T>
SelectMany<T>
IE<R> SelectMany<T, R>(this IE<T> source,
                                  Func<T, IE<R>> f)
{
 foreach (var item in source)
      foreach (var result in f(item))
           yield return result;
}
LINQ somente em IEnumerable?
Functors
class Functor f where
       fmap :: (a -> b) -> f a -> f b

instance Functor Maybe where
  fmap f (Just x) = Just (f x)
  fmap f (Nothing ) = Nothing

fmap (*2) [1..3]
> [2,4,6]

fmap (*2) Just 5
> Just 10
Funções como Functors
fmap :: (a -> b) -> ((->) r a) -> ((->) r b)

fmap :: (a -> b) -> (r -> a) -> (r -> b)
Applicative Functors
class (Functor f) => Applicative f where
      pure :: a -> f a
      (<*>) :: f (a -> b) -> f a -> f b

let a = fmap (*) [1,2,3,4]
a :: [Integer -> Integer]
Maybe Applicative Functor
instance Applicative Maybe Where
  pure = Just
  Nothing <*> _ = Nothing
  (Just f) <*> something = fmap f something



  pure (+) <*> Just 3 <*> Just 5
  > Just 8
Monoids
class Monoid m where
      mempty :: m
      mappend :: m -> m -> m
      mconcat :: [m] -> m
      mconcat = foldr mappend mempty
Monoids Pattern
• 1+1
• 2*2
• [1,2,3] ++ [4,5,6]
instance Monoid Any where
  mempty = Any False
  Any x `mappend` Any y = Any (x || y)

getAny $ Any True `mappend` Any False
> True

getAny $ Any True `mappend` mempty
> True
instance Monoid All where
  mempty = All True
  All x `mappend` All y = All (x && y)

getAll $ mempty `mappend` All True
> True

getAll $ mempty `mappend` All False
> True
Monads
Monads
class Monad m where
      return :: a -> M a
      bind :: M a -> ( a -> M b) -> M b
List Monad
Maybe Monad
IO Monad
Async Monad
LINQ – Dualidade - Rx
Reactive Extensions
• IObserver<T> == Action<Option<T>>

• Option<T> -> ()

• IObservable<T> == Action<Action<T>>

• (Option<T> -> ()) -> ()
                        • IEnumerator<T> == Func<Option<T>>

                     • () –> Option<T>

                     • IEnumerable<T> == Func<Func<Option<T>>>

                     • () –> (() –> Option<T>)
Notas Finais
• Aprenda Matemática
• Aprenda Algoritmos
• Aprenda uma Linguagem Funcional (F# :P)

• .NET Architects Rio de Janeiro
• DojoRio
• Hora Extra


• @rodrigovidal
• rodrigovidal777@gmail.com
• www.rodrigovidal.net

Contenu connexe

Tendances

Aula 01 práticaalgoritmo laboratorio
Aula 01 práticaalgoritmo laboratorioAula 01 práticaalgoritmo laboratorio
Aula 01 práticaalgoritmo laboratorio
Israel S Junior
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
Ricardo Bolanho
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
Rogerio Oliveira
 

Tendances (20)

Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Pilhas encadeadas
Pilhas encadeadasPilhas encadeadas
Pilhas encadeadas
 
Aula14
Aula14Aula14
Aula14
 
Filas encadeadas
Filas encadeadasFilas encadeadas
Filas encadeadas
 
Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...Desmistificando Built-in Functions, Lambda e List Comprehension...
Desmistificando Built-in Functions, Lambda e List Comprehension...
 
Programação-Aula004
Programação-Aula004Programação-Aula004
Programação-Aula004
 
Aula 01 práticaalgoritmo laboratorio
Aula 01 práticaalgoritmo laboratorioAula 01 práticaalgoritmo laboratorio
Aula 01 práticaalgoritmo laboratorio
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
 
Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)Cheat sheet - String Java (Referência rápida)
Cheat sheet - String Java (Referência rápida)
 
Programacao funcional
Programacao funcionalProgramacao funcional
Programacao funcional
 
Ponteiros de Função
Ponteiros de FunçãoPonteiros de Função
Ponteiros de Função
 
Funções e procedimentos
Funções e procedimentosFunções e procedimentos
Funções e procedimentos
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 
Haskell para pythonistas
Haskell para pythonistasHaskell para pythonistas
Haskell para pythonistas
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
 
TDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.JsTDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.Js
 
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
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
 
Canivete shell
Canivete shellCanivete shell
Canivete shell
 

Similaire à Monadic Design

Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
Luciano Ramalho
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
Denis Costa
 

Similaire à Monadic Design (20)

Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação Funcional
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compacto
 
Introdução ao paradigma funcional com scala
Introdução ao paradigma funcional com scalaIntrodução ao paradigma funcional com scala
Introdução ao paradigma funcional com scala
 
Pythonfuncional
PythonfuncionalPythonfuncional
Pythonfuncional
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Programação funcional tipada: uma introdução
Programação funcional tipada: uma introduçãoProgramação funcional tipada: uma introdução
Programação funcional tipada: uma introdução
 
F sharp e o paradigma funcional
F sharp e o paradigma funcionalF sharp e o paradigma funcional
F sharp e o paradigma funcional
 
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop PythonIEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
IEEEweek 2017 @ DETI Univ. Aveiro - Workshop Python
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)
 
Padrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionaisPadrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionais
 
Aula python
Aula pythonAula python
Aula python
 
Iteraveis e geradores
Iteraveis e geradoresIteraveis e geradores
Iteraveis e geradores
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesarHaskell aula5 f.ordem-sup_modulos-cifra_cesar
Haskell aula5 f.ordem-sup_modulos-cifra_cesar
 
Padrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionaisPadrões de projeto em linguagens funcionais
Padrões de projeto em linguagens funcionais
 
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
 

Plus de Rodrigo Vidal (8)

Fij
FijFij
Fij
 
F#3.0
F#3.0 F#3.0
F#3.0
 
C5, vb11, f3
C5, vb11, f3C5, vb11, f3
C5, vb11, f3
 
DevDay BH 2011 Programação Funcional
DevDay BH 2011 Programação FuncionalDevDay BH 2011 Programação Funcional
DevDay BH 2011 Programação Funcional
 
WebCamps Software Testing
WebCamps Software TestingWebCamps Software Testing
WebCamps Software Testing
 
Computacao em nuvem windows azure
Computacao em nuvem   windows azureComputacao em nuvem   windows azure
Computacao em nuvem windows azure
 
F# Functional and MultiCore Programming
F# Functional and MultiCore Programming F# Functional and MultiCore Programming
F# Functional and MultiCore Programming
 
F# Ignite - DNAD2010
F# Ignite - DNAD2010F# Ignite - DNAD2010
F# Ignite - DNAD2010
 

Dernier

Dernier (8)

ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 

Monadic Design