Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
2016 is coming....
Monadic DesignFunctional 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             ...
Programação Funcional•   Imutabilidade•   First-class Functions•   Lazy•   Pattern Matching•   Composição
Transparência Referencialvoid Multiplicar(Matriz m1, Matriz m2){     ....}
Efeitos ColateraisString 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 argumentosadd ...
CurryingCurrying é o processo de transformar uma funçãoque recebe multiplos argumentos para uma funçãoque recebe somente u...
Funções de Alta Ordem•   Filter          •   First•   Map             •   Last•   Length          •   Zip•   All          ...
Composição de Funçõesf(g(x))        g(x)g >> ff.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>>>• () –> (() ...
Empty<T>()
Return<T>()static Func<Func<Option<T>>> Return<T> (T value){return () => {        int i = 0;        return () =>          ...
Select<T>
Where<T>
SelectMany<T>IE<R> SelectMany<T, R>(this IE<T> source,                                  Func<T, IE<R>> f){ foreach (var it...
LINQ somente em IEnumerable?
Functorsclass Functor f where       fmap :: (a -> b) -> f a -> f binstance Functor Maybe where  fmap f (Just x) = Just (f ...
Funções como Functorsfmap :: (a -> b) -> ((->) r a) -> ((->) r b)fmap :: (a -> b) -> (r -> a) -> (r -> b)
Applicative Functorsclass (Functor f) => Applicative f where      pure :: a -> f a      (<*>) :: f (a -> b) -> f a -> f bl...
Maybe Applicative Functorinstance Applicative Maybe Where  pure = Just  Nothing <*> _ = Nothing  (Just f) <*> something = ...
Monoidsclass Monoid m where      mempty :: m      mappend :: m -> m -> m      mconcat :: [m] -> m      mconcat = foldr map...
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> ...
instance Monoid All where  mempty = All True  All x `mappend` All y = All (x && y)getAll $ mempty `mappend` All True> True...
Monads
Monadsclass 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> -...
Notas Finais• Aprenda Matemática• Aprenda Algoritmos• Aprenda uma Linguagem Funcional (F# :P)• .NET Architects Rio de Jane...
Monadic Design
Monadic Design
Upcoming SlideShare
Loading in …5
×

Monadic Design

2,625 views

Published on

.NET Architects Days 2012

Published in: Technology
  • Be the first to comment

Monadic Design

  1. 1. 2016 is coming....
  2. 2. Monadic DesignFunctional Programming
  3. 3. Quem sou eu?• Rodrigo Vidal• MVP de F#• Rio de Janeiro• Computação Científica / Engenharia
  4. 4. Agenda Composição
  5. 5. Linguagens
  6. 6. 12 C#, VB, 10 Java LINQ F# Nirvana 8Usefulness 6 C# Nirvana Haskell 4 LINQ 2 Haskell 0 0 2 4 6 8 10 12 Safety
  7. 7. Programação Funcional• Imutabilidade• First-class Functions• Lazy• Pattern Matching• Composição
  8. 8. Transparência Referencialvoid Multiplicar(Matriz m1, Matriz m2){ ....}
  9. 9. Efeitos ColateraisString Nome(Person p){ C.WriteLine(“Isto é um efeito colateral!”); return p.Nome;}
  10. 10. Aplicação Parcial• Aplicação parcial envolve passar menos argumentos para uma função que recebe múltiplos argumentosadd :: Int -> Int -> Intadd x y = x + yaddOne = add 1
  11. 11. CurryingCurrying é o processo de transformar uma funçãoque recebe multiplos argumentos para uma funçãoque recebe somente um argumento e retorna umaoutra função se algum paramêtro ainda fornecessário.f :: a -> b -> cÉ a forma ”curried” deg :: (a, b) -> c
  12. 12. Funções de Alta Ordem• Filter • First• Map • Last• Length • Zip• All • Take• Any • TakeWhile• Max• Min
  13. 13. Composição de Funçõesf(g(x)) g(x)g >> ff.g f(x)
  14. 14. A Essência do LINQ
  15. 15. O tipo Option
  16. 16. Destilando o LINQ• IEnumerator<T> == Func<Option<T>>• () –> Option<T>• IEnumerable<T> == Func<Func<Option<T>>>• () –> (() –> Option<T>)
  17. 17. Empty<T>()
  18. 18. 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(); }; }
  19. 19. Select<T>
  20. 20. Where<T>
  21. 21. 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;}
  22. 22. LINQ somente em IEnumerable?
  23. 23. Functorsclass Functor f where fmap :: (a -> b) -> f a -> f binstance Functor Maybe where fmap f (Just x) = Just (f x) fmap f (Nothing ) = Nothingfmap (*2) [1..3]> [2,4,6]fmap (*2) Just 5> Just 10
  24. 24. Funções como Functorsfmap :: (a -> b) -> ((->) r a) -> ((->) r b)fmap :: (a -> b) -> (r -> a) -> (r -> b)
  25. 25. Applicative Functorsclass (Functor f) => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f blet a = fmap (*) [1,2,3,4]a :: [Integer -> Integer]
  26. 26. Maybe Applicative Functorinstance Applicative Maybe Where pure = Just Nothing <*> _ = Nothing (Just f) <*> something = fmap f something pure (+) <*> Just 3 <*> Just 5 > Just 8
  27. 27. Monoidsclass Monoid m where mempty :: m mappend :: m -> m -> m mconcat :: [m] -> m mconcat = foldr mappend mempty
  28. 28. Monoids Pattern• 1+1• 2*2• [1,2,3] ++ [4,5,6]
  29. 29. instance Monoid Any where mempty = Any False Any x `mappend` Any y = Any (x || y)getAny $ Any True `mappend` Any False> TruegetAny $ Any True `mappend` mempty> True
  30. 30. instance Monoid All where mempty = All True All x `mappend` All y = All (x && y)getAll $ mempty `mappend` All True> TruegetAll $ mempty `mappend` All False> True
  31. 31. Monads
  32. 32. Monadsclass Monad m where return :: a -> M a bind :: M a -> ( a -> M b) -> M b
  33. 33. List Monad
  34. 34. Maybe Monad
  35. 35. IO Monad
  36. 36. Async Monad
  37. 37. LINQ – Dualidade - Rx
  38. 38. 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>)
  39. 39. 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

×