SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Was ist angesagt?

Programação funcional
Programação funcionalProgramação funcional
Programação funcionalNatan Mai
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcionalLP Maquinas
 
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...Matheus Pereira
 
Aula 01 práticaalgoritmo laboratorio
Aula 01 práticaalgoritmo laboratorioAula 01 práticaalgoritmo laboratorio
Aula 01 práticaalgoritmo laboratorioIsrael S Junior
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocosRicardo Bolanho
 
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)Rafael Liberato
 
Haskell para pythonistas
Haskell para pythonistasHaskell para pythonistas
Haskell para pythonistasAndrews Medina
 
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/10Marco Mendes
 
TDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.JsTDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.Jstdc-globalcode
 
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
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2Rogerio Oliveira
 

Was ist angesagt? (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
 

Ähnlich wie Monadic Design

Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação FuncionalTales Andrade
 
Objetos Pythonicos - compacto
Objetos Pythonicos - compactoObjetos Pythonicos - compacto
Objetos Pythonicos - compactoLuciano Ramalho
 
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
 
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çãoArthur Xavier
 
F sharp e o paradigma funcional
F sharp e o paradigma funcionalF sharp e o paradigma funcional
F sharp e o paradigma funcionalEvandro Souza
 
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 PythonDiogo Gomes
 
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)Luciano Ramalho
 
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 funcionaisItalos Estilon
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em PythonLuciano Ramalho
 
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 StreamsHelder da Rocha
 
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...tdc-globalcode
 
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 InterfacesDevCamp Campinas
 
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
 
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_cesarCRISLANIO MACEDO
 
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 funcionaisLay de Castro
 
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
 

Ähnlich wie 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
 

Mehr von Rodrigo Vidal

DevDay BH 2011 Programação Funcional
DevDay BH 2011 Programação FuncionalDevDay BH 2011 Programação Funcional
DevDay BH 2011 Programação FuncionalRodrigo Vidal
 
WebCamps Software Testing
WebCamps Software TestingWebCamps Software Testing
WebCamps Software TestingRodrigo Vidal
 
Computacao em nuvem windows azure
Computacao em nuvem   windows azureComputacao em nuvem   windows azure
Computacao em nuvem windows azureRodrigo Vidal
 
F# Functional and MultiCore Programming
F# Functional and MultiCore Programming F# Functional and MultiCore Programming
F# Functional and MultiCore Programming Rodrigo Vidal
 
F# Ignite - DNAD2010
F# Ignite - DNAD2010F# Ignite - DNAD2010
F# Ignite - DNAD2010Rodrigo Vidal
 

Mehr von 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
 

Monadic Design