functional programming in groovy

46
Functional Programming 101 in Groovy Evgeny Goldin DevCon Tel-Aviv, February 14, 2013

Upload: evgeny-goldin

Post on 30-Jun-2015

1.609 views

Category:

Technology


5 download

DESCRIPTION

A description of Functional Programming basics and how they are applied in Groovy.

TRANSCRIPT

Page 1: Functional Programming in Groovy

Functional Programming 101 in Groovy

Evgeny GoldinDevCon Tel-Aviv, February 14, 2013

Page 2: Functional Programming in Groovy

Evgeny Goldin

Java developer since 2000

FP enthusiast: Scheme, Perl, Groovy, Scala

GroovyMag, Gr8Conf

SCM at Trademob

github.com/evgeny-goldin/

@evgeny_goldin

Page 6: Functional Programming in Groovy

In this session

Mindset switch

Page 7: Functional Programming in Groovy

Why FP?

Page 8: Functional Programming in Groovy

Because shit happens

Page 9: Functional Programming in Groovy

.. or do we make it happen?

Page 10: Functional Programming in Groovy

Average code is complex

Side-effects go wild

Logical steps are interleaved

Changes are error-prone

http://www.guardian.co.uk/sustainable-business/research-confirms-health-impacts-tire

Page 11: Functional Programming in Groovy

Average state is fragile and shared

Exposed for updates in any way

Can easily mutate under your feet

Changes are error-prone

http://www.bbcgoodfood.com/content/knowhow/glossary/egg/

Page 12: Functional Programming in Groovy

Parallelism is hard

“The Multicore Revolution”

Threads + shared mutable state :(

Changes are error-prone

http://www.russel.org.uk/Presentations/euroPython2010_theMulticoreRevolution.pdfhttp://jalopnik.com/5965581/this-is-how-not-to-parallel-park-on-a-hill

Page 13: Functional Programming in Groovy

Changes are error-prone

Page 15: Functional Programming in Groovy

ModularityBreak the flow into distinct steps

Do one thing and do it well

Page 16: Functional Programming in Groovy

FlexibilityShuffle your steps

Page 17: Functional Programming in Groovy

TestabilityEnsure correctness of your steps

Page 18: Functional Programming in Groovy

ParallelismScale your steps!

Page 19: Functional Programming in Groovy

FP building blocks(only a subset this time)

Page 20: Functional Programming in Groovy

RecursionList = head() + tail()

State is hidden, built up on stack

Recursion eliminationhttps://bitbucket.org/evgenyg/devcon-2013/src/master/recursion.groovy

Page 21: Functional Programming in Groovy

Immutable StateMoving parts are minimized

No defensive copying

Caching, Parallelism

Page 22: Functional Programming in Groovy

Immutable StateNew state = f ( old state )

Changes are isolated, constructor only

g ( i + 1 ), g ( list + ‘element’ )

Page 23: Functional Programming in Groovy

Immutable StatePersistent data structures

Updated in place

Yields a new immutable state

Page 25: Functional Programming in Groovy

First-class functionsAnonymous functions

Higher-order functions

Command/Template/Visitor => “Free Willy”

Page 26: Functional Programming in Groovy

No side-effectssin, cos, max, min, sum, sort

Opens doors for optimizations

Caching, Parallelism

Page 27: Functional Programming in Groovy

Mindset switch Imperative => Functional

Variables => Values

Classes => Functions

Explicit instructions => Declarative definitions

How (Steps) => What (Result)

Page 28: Functional Programming in Groovy

Mindset switchPointers, memory allocations, GC - check

State management

Iterations

Filtering, conversion, folding

Parallelism

Page 29: Functional Programming in Groovy

FP in Groovy

Page 30: Functional Programming in Groovy

Gradual conversion

http://www.buysgmath.com/p/200/eph-gradually-difficulty-mathematics-1/

Page 31: Functional Programming in Groovy

final j = 5@Immutable

Page 32: Functional Programming in Groovy

Anonymous Functionsa.k.a. Closures

Page 34: Functional Programming in Groovy

find()

any()

every()

each()

eachWithIndex()

takeWhile()

dropWhile()

Page 35: Functional Programming in Groovy

Collection

Range

Map

Array

String

...

Object.iterator()

Page 36: Functional Programming in Groovy

Categories, Meta, Extensionspublic  static  <T>  Collection<T>  findAll(Collection<T>  self,                                                                                  Closure  filter)  

public  static  <T>  List<T>  collect(Collection<?>  self,                                                                    Closure<T>  transform)

public  static  T  inject(Collection<T>  self,                                                Closure<V>  closure)

public  static  <T>  T              head(List<T>  self)

public  static  <T>  List<T>  tail(List<T>  self)

...

org.codehaus.groovy.runtime.DefaultGroovyMethods

Page 37: Functional Programming in Groovy

Memoizationa.k.a. Caching

https://bitbucket.org/evgenyg/devcon-2013/src/master/memoization.groovy

Page 38: Functional Programming in Groovy

TrampolineRecursion => Loop (no stack overflow)https://bitbucket.org/evgenyg/devcon-2013/src/master/trampoline.groovy

Page 39: Functional Programming in Groovy

GPars!Data Parallelism

https://bitbucket.org/evgenyg/devcon-2013/src/master/gpars.groovy

Page 40: Functional Programming in Groovy

eachParallel()

collectParallel()

findAllParallel()

everyParallel()

foldParallel()

sumParallel()

gmemoize()

Page 41: Functional Programming in Groovy

FP Candidates

Page 42: Functional Programming in Groovy

Loops => any / every

http://en.hdyo.org/tee/questionshttps://bitbucket.org/evgenyg/devcon-2013/src/master/loops.groovy

Page 44: Functional Programming in Groovy

Open your eyes

Page 45: Functional Programming in Groovy

pinboard.in/u:evgenyg/t:fp/

Arturo Herrero - Functional Programming with Groovy

Neal Ford - Functional Thinking

Martin Odersky - FP Principles in Scala

Erik Meijer - FP Fundamentals

MIT - Structure and Interpretation of Computer Programs

University of Washington - Programming Languages

Stanford - Programming Paradigms