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,505 views
2,415 views

Published on

.NET Architects Days 2012

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,505
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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

×