Successfully reported this slideshow.
Your SlideShare is downloading. ×

Struktury algebraiczne w JavaScripcie

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Solid.js - następca Reacta?
Solid.js - następca Reacta?
Loading in …3
×

Check these out next

1 of 71 Ad

Struktury algebraiczne w JavaScripcie

Struktury algebraiczne do programowania mają się tak, jak fizyka molekularna ma się do gotowania - można się bez nich obejść, ale to nie znaczy, że ich tam nie ma. Podczas najbliższego DevDucka przyjrzymy się kilku z nich i sprawdzimy, jak mogą się przydać do pisania czystego kodu i rozwiązywania problemów w praktyce.

Struktury algebraiczne do programowania mają się tak, jak fizyka molekularna ma się do gotowania - można się bez nich obejść, ale to nie znaczy, że ich tam nie ma. Podczas najbliższego DevDucka przyjrzymy się kilku z nich i sprawdzimy, jak mogą się przydać do pisania czystego kodu i rozwiązywania problemów w praktyce.

Advertisement
Advertisement

More Related Content

Recently uploaded (20)

Advertisement

Struktury algebraiczne w JavaScripcie

  1. 1. struktury algebraiczne w js
  2. 2. marek ● JS Developer @ BH for 4+ years ● FP, JS, react, elixir, haskell ● intercaetera.com
  3. 3. po co?
  4. 4. jest z tym problem
  5. 5. ← to jest trudne
  6. 6. problem → → rozwiązanie
  7. 7. problem → → rozwiązanie
  8. 8. struktury algebraiczne - rozwiązują ogólne problemy* - odkryte racjonalnie** - bardzo rygorystyczne***
  9. 9. intuicja - do budowania systemów - do naprawiania istniejących aplikacji - do refaktoryzacji - do rozwiązywania bugów
  10. 10. ← potrzebna tu
  11. 11. co to?
  12. 12. - zbiór - operacja na nim - zasady które spełnia - typ - funkcja na nim - zasady które spełnia </>
  13. 13. (
  14. 14. notacja typów - Int, String — typy - n :: Type — n należy do typu Type - Constr a — konstruktor/generyk (jak T<a>) - a -> b — funkcja - a -> b -> c — funkcje są curry’owane f = (a, b) => a+b ~= g = a => b => a + b f(2, 3) => 5 ~= g(2)(3) => 5 currying
  15. 15. ściąga na przyszłość https://github.com/fantasyland/fantasy-land https://github.com/fantasyland/static-land
  16. 16. )
  17. 17. funktory <$>
  18. 18. Int -> Bool () -> Int Identity Int Dict String Int List Int Maybe Int
  19. 19. Int -> Bool () -> Int Identity Int Dict String Int List Int Maybe Int
  20. 20. a -> Bool () -> a Identity a Dict String a List a Maybe a
  21. 21. monady funktory są jak burrito 🌯
  22. 22. zróbmy nasz własny
  23. 23. Effect a () -> a
  24. 24. 1 :: Number () => 1 :: Effect Number () => 2 :: Effect Number () => ‘alpha’ :: Effect String () => [1, 2, 3] :: Effect List Number
  25. 25. funktor = typ + fmap
  26. 26. fmap f :: (a -> b) -> f a -> f b
  27. 27. Array.prototype.map
  28. 28. fmap Array :: (a -> b) -> Array a -> Array b [1, 2, 3].map(x => x*2) => [2, 4, 6]
  29. 29. fmap Effect :: (a -> b) -> Effect a -> Effect b
  30. 30. różne funktory - kowariantne - kontrawariantne - bifunktory i profunktory - transformacje naturalne - aplikatywy - funktory monoidalne - …monady?
  31. 31. monoid <>
  32. 32. monoidy nie są funktorami
  33. 33. monoid = typ + concat + empty
  34. 34. typ: Int concat: + empty: 0
  35. 35. typ: Int concat: * empty: 1
  36. 36. monoidy mogą być funktorami
  37. 37. typ: Array concat: Array.prototype.concat empty: []
  38. 38. monoidy mogą być funkcjami
  39. 39. typ: a -> a concat: _.flow empty: x => x ← czyli po prostu składanie funkcji
  40. 40. ale przede wszystkim monoidy są redukowalne
  41. 41. array.reduce(reducer, initial)
  42. 42. [type].reduce(concat, empty)
  43. 43. jak zredukować Effect?
  44. 44. concat f :: f -> f -> f zwykle
  45. 45. concat Effect :: Effect -> Effect -> Effect
  46. 46. można tak, ale to niezbyt praktyczne
  47. 47. w programowaniu funkcyjnym chodzi o składanie funkcji
  48. 48. jak mamy takie same typy to nie ma problemu (a → a) ° (a → a) ⇒ (a → a) (Int → Int) ° (Int → Int) ⇒ (Int → Int)
  49. 49. ale jak nie, to funkcje muszą się zgadzać w typach (a → b) ° (b → c) ⇒ (a → c) (Int → String) ° (String → Bool) ⇒ (Int → Bool)
  50. 50. ale co jeśli chcielibyśmy złożyć 2 × a -> Effect a
  51. 51. compose :: (a -> b) -> (b -> c) -> (a -> c)
  52. 52. concat (a -> Effect c) :: (a -> Effect b) -> (b -> Effect c) -> (a -> Effect c)
  53. 53. ale co my teraz zrobiliśmy?
  54. 54. monoid w endofunktorze
  55. 55. “All told, a monad is just a monoid in the category of endofunctors.”
  56. 56. monada =<<
  57. 57. monada = funktor + chain
  58. 58. chain f :: (a -> f b) -> f a -> f b
  59. 59. Array.prototype.flatMap
  60. 60. chain Effect :: (a -> Effect b) -> Effect a -> Effect b
  61. 61. funkcje = kompozycja
  62. 62. monady = ✨kompozycja✨
  63. 63. “Once you understand monads, you lose the ability to explain them to others.”
  64. 64. mam nadzieję że poszło mi w miarę ok

×