Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Functional Programming per tutti

297 Aufrufe

Veröffentlicht am

Giancarlo Valente spiega il functional programming all'incontro mensile del Club degli Sviluppatori di Puglia. La storia da Alonzo Church e il lambda calcolo fino ai giorni d'oggi con la confluenza del functional programming nei linguaggi imperativi tradizionali. Esempi in Javascript, php, Erlang, haskell.

Il video del talk su youtube :)
https://youtu.be/LGIGyrD9Y9w

Veröffentlicht in: Ingenieurwesen
  • Als Erste(r) kommentieren

Functional Programming per tutti

  1. 1. FUNCTIONAL PROGRAMMING PER TUTTI di Giancarlo Valente
  2. 2. CHI SONO @gncvalente agile coach club auLAB hack-ademy
  3. 3. www.giancarlovalente.it - agile coach
  4. 4. Club degli Sviluppatori Puglia
  5. 5. www.aulab.it
  6. 6. www.hack-ademy.it - coding bootcamp
  7. 7. FUNCTIONAL PROGRAMMING f per full screen
  8. 8. VI E' MAI CAPITATO DURANTE IL LAVORO DI PENSARE ... che tutto e' completamente sbagliato inutilmente complicato
  9. 9. SI
  10. 10. 1996
  11. 11. VB
  12. 12. PYTHON
  13. 13. LIST COMPREHENSIONS python - list comprehensions 00:00
  14. 14. LIST COMPREHENSIONS - CON FILTRO python - list comprehensions - con ltro 00:00
  15. 15. LA MIA FANTASIA INIZIO' A CORRERE IN UN PARADISO DI ELEGANZA cartelle_esattoriali = [ elabora_cartella(contribuente) for contribuente in contribuenti if contribuente.valido ]
  16. 16. MENTRE OGNI GIORNO DOVEVO FARE QUESTO Dim contribuenti(100) as Contribuente Dim cartelle_esattoriali As New List(Of Cartella_Esattoriale) Dim i ad Integer For i = 1 To contribuenti.Length contribuente = contribuenti[i] if contribuente.valido then cartelle_esattoriali.add(elabora_cartella(contribuente)) end if Next
  17. 17. il python posso leggerlo il vb devo eseguirlo cartelle_esattoriali = [ elabora_cartella(contribuente) for contribuente in contribuenti if contribuente.valido ] Dim contribuenti(100) as Contribuente Dim cartelle_esattoriali As New List(Of Cartella_Esattoriale) Dim i as Integer For i = 1 To contribuenti.Length contribuente = contribuenti[i] if contribuente.valido then cartelle_esattoriali.add(elabora_cartella(contribuente)) end if Next
  18. 18. wikipedia List Comprehension
  19. 19. IL TEMPO E' PASSATO ...
  20. 20. C# RULEZ!!! ... fast forward >> 2006
  21. 21. OOP, Ereditarieta', Plimor smo, Design Patterns ... :)
  22. 22. JAVASCRIPT on('ready', function() { var x = "Ciao Mondo"; alert(x); });
  23. 23. PROTOTYPE
  24. 24. SCRIPT.ACULO.US
  25. 25. Thomas Fuchs
  26. 26. AGOSTO 2006 Can Your Programming Language Do This? JOEL ON SOFTWARE - Can Your Programming Language Do This?
  27. 27. javascript - funzioni passate come parametro 00:00
  28. 28. JAVASCRIPT E' UN'IMPLEMENTAZIONE DI SCHEME ???? "In 1995, the company recruited Brendan Eich with the goal of embedding the Scheme programming language into its Netscape Navigator. " wikipedia
  29. 29. FUNCTIONAL PROGRAMMING FOR THE REST OF US here
  30. 30. UNA NUOVA SCOPERTA functional programming
  31. 31. LA STORIA
  32. 32. 1941 lambda calculus Alonzo Church Church invented a formal system called the lambda calculus
  33. 33. LAMBDA CALCULUS termini variabili function application function abstraction ( lambda )
  34. 34. LAMBDA CALCULUS funzioni che accettano altre funzioni come parametro e ritornano funzioni come risultato
  35. 35. LAMBDA CALCULUS non di parla di "esecuzione" ma si parla di riduzione
  36. 36. lambda calcolo in js 00:00 fonte - sorgente giuhub
  37. 37. MACCHINA DI TURING
  38. 38. QUALSIASI MACCHINA DI TURING PUO' ESSERE ESPRESSA IN LAMBDA CALCOLO Turing machines and lambda calculus are equivalent in power in 1936 Turing proved that both models are equally strong in the sense that they de ne the same class of computable functions History of Computing at Princeton University
  39. 39. Lambda Calculus ( Declarative ) Alonzo Church Turing Machine ( Imperative ) Alan Turing
  40. 40. Based on the concept of a Turing machine are the present day Von Neumann computers. Conceptually these are Turing machines with random access registers. Imperative programming languages such as Fortran, Pascal etcetera as well as all the assembler languages are based on the way a Turing machine is instructed: by a sequence of statements. Functional programming languages, like Miranda, ML etcetera, are based on the lambda calculus. An early (although somewhat hybrid) example of such a language is Lisp. Reduction machines are speci cally designed for the execution of these functional languages. fonte - lambda calcolo cs.kun.nl
  41. 41. 1960 ()((()((())))) John McCarthy
  42. 42. Lisp Machine - wikipedia
  43. 43. BUSINESS IMPERATIVE ... TUTTI NOI ACCADEMIA FP ... ACCADEMIA
  44. 44. TEMPI MODERNI
  45. 45. MARZO 2005 The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software
  46. 46. www.adapteva.com Epiphany-V: A 1024-core 64-bit RISC processor
  47. 47. 2007 Joe book on Erlang
  48. 48. 2014 - ADOZIONE AZIENDE Facebook (erlang, haskell) Twitter (scala) WhatsApp (erlang) Amazon (erlang) FourSquare (scala) PayPal (scala) i.e. haxl case studies facebook - open source backend tools
  49. 49. 2014 - CONFLUENZA ha seguito ... ... Java 8 ... implementa le ... lambda C#, Ruby, python, php C++ 11 Functional programming in C++
  50. 50. ... CHE COSA E' LA PROGRAMMAZIONE FUNZIONALE? QUALI SONO LE SUE CARATTERISTICHE? IN PRATICA
  51. 51. FUNZIONI
  52. 52. CHE COSA E' UNA FUNZIONE funzione - wikipedia
  53. 53. FUNCTIONAL PROGRAMMING treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data functional programming - wikipedia
  54. 54. FUNCTIONS functions maps inputo to output INPUT x FUNCTION f: OUTPUT f(x) maps values between a domain and a codomain Input and outputs values already exists wikipedia - Function in mathematics
  55. 55. FUNCTIONS f(x) = x + 1 1 ---> 2 6 ---> 7 9 ---> 10 un valore e' qualcosa che non cambia nel tempo
  56. 56. A --> ---> B
  57. 57. Stato --> ---> Stato mutato
  58. 58. FUNCTIONAL COMPOSITION Function Composition - wikipedia
  59. 59. CALCOLO DELL'AREA DEL CERCHIO r^2 * pi
  60. 60. CALCOLO DELL'AREA DEL CERCHIO area_cerchio(r) = moltiplica_per_pi( quadrato( r ) )
  61. 61. area_cerchio in js 00:00
  62. 62. area_cerchio in elixir - functional composition 00:00
  63. 63. area_cerchio in PHP - functional composition 00:00
  64. 64. FUNCTIONAL-PHP - FUNCTIONAL COMPOSITION use function Functionalcompose; $plus2 = function ($x) { return $x + 2; }; $times4 = function ($x) { return $x * 4; }; $composed = compose($plus2, $times4); $result = array_map($composed, array(1, 2, 5, 8)); var_dump($result); // array(12, 16, 28, 40) github : functional-php
  65. 65. PATTERN MATCHING
  66. 66. PATTERN MATCHING erlang - simplest pattern matching 00:00
  67. 67. PATTERN MATCHING erlang - simple pattern matching 00:00
  68. 68. PATTERN MATCHING haskell - pattern matching 00:00
  69. 69. IMMUTABILITA' i valori esistono ... le funzioni li mappano soltanto lo stato non viene modi cato, ne' trasformato una funzione viene valutata e ritorna un nuovo valore EVALUATION
  70. 70. i dati vengono trattati come immutabili immagina un mondo dove nessuno puo' rubare o modi care un qualcosa ...
  71. 71. X = X + 1 Fail!
  72. 72. IMMUTABILITY erlang - immutability 00:00
  73. 73. erlang - immutability 00:00
  74. 74. QUESTO E' UNO SCHERZO
  75. 75. MA ... SI PUO' PROGRAMMARE QUALCOSA DI VERO, DI REALE INQUESTI LINGUAGGI?
  76. 76. IL MIO FOR DEL C AD ESEMPIO ? for (int i = 0; i < 100; ++i) { /* code */ }
  77. 77. NO LOOPS
  78. 78. CONTEGGIO erlang - no loops 00:00
  79. 79. SOMMA DEGLI ELEMENTI DI UNA LISTA sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum(xs)
  80. 80. haskell - no loops - sum list numbers 00:00
  81. 81. haskell - no loops - sum list numbers - module 00:00
  82. 82. SOMMA DEGLI ELEMENTI DI UNA LISTA -module(somma). -export([sum/1]). sum([]) -> 0; sum([H|T]) -> H + sum(T).
  83. 83. erlang - no loops - sum list numbers - module 00:00
  84. 84. MI SEMBRA LIMITATO, OGNI VOLTA CHE DEVO FARE QUALCOSA DEVO RIFARE QUESTO CICLO ?
  85. 85. HIGHER ORDER FUNCTIONS funzioni di ordine superiore Higher-order function - wikipedia
  86. 86. FUNCTIONS AS FIRST CLASS VALUES functions are values!!!
  87. 87. FOLDL
  88. 88. se io ho sum e prod che sommano e moltiplicano tutti gli elementi di una lista posso astrarre
  89. 89. erlang - foldl 00:00
  90. 90. HASKELL - FOLD foldl :: (a -> b -> a) -> b -> [a] -> b foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs
  91. 91. haskell - foldl - module 00:00
  92. 92. LE FUNZIONI SONO VALORI ... ... E VENGONO TRATTATI COME VALORI
  93. 93. CURRY functions are values!!! sum :: [Int] -> Int sum = foldl (+) 0 prod :: [Int] -> Int prod = foldl (*) 1
  94. 94. haskell - foldl - curry 00:00
  95. 95. CURRY Applicazione parziale di una funzione, mi ritorna una funzione che accetta i parametri restanti
  96. 96. come farestin un ciclo di elaborazione in PHP ? nooooo posso fare di meglio risultati = [] for elemento in contenitore risultati[] = elabora(elemento)
  97. 97. MAP - PHP STANDARD $stringArray = [ 'prova', 'test', 'ciao']; $result = array_map('strtoupper', $stringArray);
  98. 98. MAP - JS var numbers = [1, 5, 10, 15]; var roots = numbers.map(function(x){ return x * 2; });
  99. 99. MAP funzione di base di tutti i linguaggi FP ovviamente esiste l'implementazione di "libreria" ma vediamo come verrebbe implementata in FP
  100. 100. haskell - map 00:00
  101. 101. FILTER - PHP $result = array_filter($intArray, function($a) { return ($a % 2 === 0); });
  102. 102. FILTER - ERLANG filter(Pred, L) -> lists:reverse(filter(Pred, L,[])). filter(_, [], Acc) -> Acc; filter(Pred, [H|T], Acc) -> case Pred(H) of true -> filter(Pred, T, [H|Acc]); false -> filter(Pred, T, Acc) end.
  103. 103. LIST COMPREHENSIONS list comprehensions - wikipedia
  104. 104. map e lter erlang - list comprehensions 00:00
  105. 105. MAP, REDUCE, FILTER ETC ETC oggi esistono diverse librerie per ogni linguaggio che facilitano l'adozione di uno stile di programmaizone funzionale JS, PHP, C#, C++
  106. 106. JS lo dash lazy js ramda
  107. 107. PHP functional php phunctional
  108. 108. CSHARP ... LINQ !!!
  109. 109. OOP SOLID PRINCIPLES Single Responsability Principle Open/closed Principle Liskov Substitution Principle Interface Segregation Principle
  110. 110. OOP SOLID PRINCIPLES Single Responsability Principle Function Open/closed Principle higher-order functions Liskov Substitution Principle polimor smo parametrico Interface Segregation Principle Function Lev Gorodinski
  111. 111. DEPENDENCY INJECTION Functions passed around !!!
  112. 112. OOP DESIGN PATTERNS Factory Function Command function Strategy function decorator function Robert C. Martin
  113. 113. REFERENCIAL TRANSPARENCY f(x,y) = x + y qualsiasi cosa avvenga all'esterno dara' sempre lo stesso risultato
  114. 114. BLACK BOX E TESTING A --> ---> B
  115. 115. UNIT TESTING no side effects Testing ... easy functions are idempotent always testing one thing
  116. 116. DEBUGGING debugging is easy!
  117. 117. MEMOIZATION Wikipedia
  118. 118. FATTORIALE function factorial($n) { if($n == 1) return 1; return $n * factorial($n - 1); }
  119. 119. FATTORIALE CON MEMOIZATION in programmazione imperativa function factorial($n) { static $cache = array(); if($n == 1) return 1; if(! array_key_exists($n, $cache)) { $cache[$n] = $n * factorial($n - 1); } return $cache[$n]; }
  120. 120. FATTORIALE CON MEMOIZATION in programmazione funzionale // functional abstraction function memoize($func) { return function() use($func) { static $cache = array(); $args = func_get_args(); $key = serialize($args); if(! array_key_exists($key, $cache)) { $cache[$key] = call_user_func_array($func, $args); } return $cache[$key]; }; }
  121. 121. FATTORIALE CON MEMOIZATION in programmazione funzionale // functional programming $factorial = function($n) use(&$factorial) { if($n == 1) return 1; return $n * $factorial($n -1); }; $mem_factorial = memoize($factorial); echo $mem_factorial(10); echo $mem_factorial(10); echo $mem_factorial(11);
  122. 122. php - factorial memoization in FP 00:00
  123. 123. CONCURRENCY no locks no deadlocks
  124. 124. MASSIVELY PARALLELIZABLE il compilatore puo' analizzare il codice e capire che R1 e R3 possono essere calcolati in parallelo, poi calcola R2, e quindi R4 e' pronto R1 = faiQualcosa_1_QuiCon(A, B, C) R2 = faiQualcosa_2_QuiCon(A, R1) R3 = faiQualcosa_3_QuiCon(C, D) R4 = faiQualcosa_4_QuiCon(R3, R2) print R4
  125. 125. SEPARATION OF DATA AND BEHAVIOUR
  126. 126. TREAT CODE AS DATA ship execution lisp macros
  127. 127. HOT CODE UPDATE impossibile in imperative code !
  128. 128. LAZY EVALUATION E STRUTTURE DATI INFINITE lazy --> enorme potenziale per l'ottimizzazione lazy --> strutture dati in nite
  129. 129. haskell - in nite data structures 00:00
  130. 130. haskell - fattoriale con in nite data structures 00:00 stack-over ow - In nitely lazy factorial in Haskell
  131. 131. CAN PROGRAMMING BE LIBERATED ...
  132. 132. CAN PROGRAMMING BE LIBERATED FROM THE VON NEUMAN STYLE? A FUNCTIONAL STYLE ...
  133. 133. CAN PROGRAMMING BE LIBERATED FROM THE VON NEUMAN STYLE? A FUNCTIONAL STYLE AND ITS ALGEBRA OF PROGRAMS John Backus - 1977 Turing Award Lecture Algebra of programs
  134. 134. IL PRESENTE Erlang
  135. 135. IL FUTURO haskell Dichiarativo - per parallelizzare - ottimizzare con le statistiche - definire altrilinguaggi
  136. 136. DICHIARIATIVO HASKELL TROVERA' MAI LA SUA NICCHIA ? haskell dichiarativo .. non ci hanno lavorato tante persone quante sul compilatore C potra' fare come SQL ottimizzazioni anche basandosi sullestatistiche in esecuzione https://www.quora.com/Is- Haskell-as-fast-as-C++-If-not-why-not
  137. 137. http://elm-lang.org/
  138. 138. Microsoft http://blog.raintown.org/p/lava.html
  139. 139. FPGA sysntesys from a functional declartive language http://www.clash-lang.org/ http://yager.io/HaSKI/HaSKI.html http://christiaanb.github.io/posts/clash-fpga-starter/

×