Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Funktionale Programmierung mit Javascript

Michael Zinn
September 29, 2016

Funktionale Programmierung mit Javascript

Folien zum cosee techtalk vom 29.9.2016

Michael Zinn

September 29, 2016
Tweet

More Decks by Michael Zinn

Other Decks in Programming

Transcript

  1. WARUM FP? Große Programme sind leichter handhabbar Mächtig (aber auch

    steile Lernkurve...) Weniger Code Weniger Bugs Vereinfachtes Refactoring
  2. WIE? Variablen -> Konstanten Objekte -> Records + Lenses Schleifen

    -> Mappings Seiteneffekte -> Monads/Promises
  3. TYPES Beispiel Beschreibung Type Beispiel Beschreibung Type "Hallo" Unicode Text

    String 5 IEEE Float64 Number [1,2,3] Zahlen-Array [Number] length Funktion String -> Number {"a":3, "b":4} Map Map String Number
  4. PURE FUNCTIONS Der Rückgabewert einer Funktion hängt ausschließlich von den

    Eingabeparametern ab Die Funktion hat keine Seiteneffekte / / p u r e : f u n c t i o n m o r e ( x ) { r e t u r n x + 1 ; } / / i m p u r e : c o n s o l e . l o g ( " S e i t e n e f f e k t " ) ;
  5. REFERENTIAL TRANSPARENCY Man kann den Aufruf einer Funktion durch ihren

    Rückgabewert ersetzen ohne dass sich dadurch das Programm verändert: v a r x = " h e y " . l e n g t h ; v a r x = 3 ;
  6. / / ( N u m b e r ,

    N u m b e r ) - > N u m b e r f u n c t i o n a d d ( a , b ) { r e t u r n a + b ; }
  7. / / ( N u m b e r ,

    N u m b e r ) - > N u m b e r c o n s t a d d = ( a , b ) = > a + b ;
  8. / / N u m b e r - >

    N u m b e r ? ? ? c o n s t a d d = ( a ) = > ? ? ?
  9. / / N u m b e r - >

    N u m b e r - > N u m b e r c o n s t a d d = ( a ) = > ( b ) = > a + b ;
  10. COMPOSE & PIPE Funktionen verketten: / / [ a ]

    - > N u m b e r c o n s t l a s t I n d e x = ( x ) = > s u b t r a c t ( l e n g t h ( x ) , 1 ) ; c o n s t l a s t I n d e x = c o m p o s e ( s u b t r a c t ( _ _ , 1 ) , l e n g t h ) ; c o n s t l a s t I n d e x = p i p e ( l e n g t h , s u b t r a c t ( _ _ , 1 ) ) ;
  11. FUNCTOR Geordneter Kontext für einen oder mehrere Werte des gleichen

    Typs Hat eine "map"-Funktion, auch bekannt als: <$> then fmap transform Typ der map-Funktion: Functor f => (a -> b) -> f a -> f b
  12. BEISPIEL #1 map: Functor f => (a -> b) ->

    f a -> f b / / ( a - > b ) - > f a - > f b / / ( S t r i n g - > N u m b e r ) - > [ S t r i n g ] - > [ N u m b e r ] m a p ( l e n g t h , [ " h e l l o " , " f u n c t o r " ] ) / / [ 5 , 7 ]
  13. BEISPIEL #2 map: Functor f => (a -> b) ->

    f a -> f b / / ( a - > b ) - > f a - > f b / / ( N u m b e r - > N u m b e r ) - > M a y b e N u m b e r - > M a y b e N u m b e r m a p ( m u l t i p l y ( 2 ) , M a y b e . J u s t ( 4 ) ) / / M a y b e . J u s t ( 8 )
  14. APPLICATIVE Ist ein Functor Hat eine "apply"-Funktion, auch bekannt als:

    <*> ap apply: Applicative f => f (a -> b) -> f a -> f b
  15. MONAD Ist ein Applicative (und somit auch ein Functor) Hat

    eine "bind"-Funktion, auch bekannt als: =<< then chain mapcat flatMap thenCompose transformAndConcat bind: Monad m => (a -> m b) -> m a -> m b Monad Laws: "Implementiere bind bitte vernün ig."