Functional Pe(a)rls

66
osfameron Functional Pe(a)rls

description

\"Lightning\" talk given at IPW 2008 on 5 fun things to do with Perl for functional programming. Warning: may contain Evil.

Transcript of Functional Pe(a)rls

Page 1: Functional Pe(a)rls

osfameron

Functional Pe(a)rls

Page 2: Functional Pe(a)rls

Functional pearls

x5

Page 3: Functional Pe(a)rls

Functional Pe(a)rls

5 min

Page 4: Functional Pe(a)rls

Functional pearls

eeek!

Page 5: Functional Pe(a)rls

1. map, grep, join

map

Page 6: Functional Pe(a)rls

1. map

●my @names = qw/

Pippo Pluto Pinco /;

Page 7: Functional Pe(a)rls

1. map

●Hello Pippo!●Hello Pluto!●Hello Pinco!

Page 8: Functional Pe(a)rls

1. map

●my @greetings;●for (@names) {● push @greetings, "Hello $_!";

●}

Page 9: Functional Pe(a)rls

1. map

●my @greetings = map { "Hello $_!" } @names

Page 10: Functional Pe(a)rls

1. map, grep, join

grep

Page 11: Functional Pe(a)rls

1. grep

●Names that contain “i”

–Pippo–Pinco

Page 12: Functional Pe(a)rls

1. grep

●my @names_with_i;●for (@names) {● push @names_with_i, $_ if /i/;

●}

Page 13: Functional Pe(a)rls

1. grep

●my @names_with_i =

grep /i/, @names;

Page 14: Functional Pe(a)rls

1. map, grep, join

join

Page 15: Functional Pe(a)rls

1. join

●Pippo, Pluto, Pinco

Page 16: Functional Pe(a)rls

1. join

●my $joined = $names[0];● for (@names[1..$#names]) {● $joined .= ', ';● $joined .= $_;● }

Page 17: Functional Pe(a)rls

1. join

●my $joined = join ', ' => @names;

Page 18: Functional Pe(a)rls

More Complex

Page 19: Functional Pe(a)rls

2. A sequence

● Debolaz, on #moose● a list of numbers like

–10, 25, 50,–100, 250, 500,–1000,etc

● without tracking any other state than the number itself

Page 20: Functional Pe(a)rls

2. A sequence

1. (power of 10) Multiply by 2.5

2. Multiply by 23. Multiply by 2

Page 21: Functional Pe(a)rls

2. A sequence

without tracking any other state

than the number itself

Page 22: Functional Pe(a)rls

2. A sequence

/^1/

Page 23: Functional Pe(a)rls

2. A sequence

/^1/ # power of 10

Page 24: Functional Pe(a)rls

2. A sequence

●cycle [2.5, 2, 2]● 2.5, 2, 2,● 2.5, 2, 2, ...

Page 25: Functional Pe(a)rls

2. A sequence

●Oops! ●Perl doesn't have infinite sequences

Page 26: Functional Pe(a)rls

2. A sequence

Iterators

Page 27: Functional Pe(a)rls

2. A sequence

● curry cycle (@list) {● my @curr = @list;● return sub {● @curr = @list unless @curr;● return shift @curr;● };● }

Page 28: Functional Pe(a)rls

2. A sequence

●my $c = cycle [2.5, 2, 2];– say $c->(); # 2.5– say $c->(); # 2– say $c->(); # 2– say $c->(); # 2.5– ...

Page 29: Functional Pe(a)rls

2. A sequence

● say for● take 12 =>● scan(● mk_seq( [2.5, 2, 2] ),● 10● );

Page 30: Functional Pe(a)rls

2. A sequence

●curry mk_seq (@multipliers) {

● cycle [ map { times($_) } @multipliers ];

● };

Page 31: Functional Pe(a)rls

2. A sequence

●curry times ($x,$y) { ● $x * $y ●};

Page 32: Functional Pe(a)rls

3. Currying

●curry times ($x,$y) { ● $x * $y ●};

Page 33: Functional Pe(a)rls

3. Currying

●my $triple = times(3);●say $triple->(10); ● # 30

Page 34: Functional Pe(a)rls

3. Currying

●my $multiply = times;●say $multiply->(6, 8);

Page 35: Functional Pe(a)rls

3. Currying

●my $multiply = \×●my $multiply = times;

Page 36: Functional Pe(a)rls

3. Currying

●Sub::Curried

Page 37: Functional Pe(a)rls

3. Currying

●Devel::Declare

Page 38: Functional Pe(a)rls

Devel::Declare

●New syntax!● (But better than source filters)

– Currying

– Monads

– List comprehensions

– Functions that work on @arrays and lists

Page 39: Functional Pe(a)rls

2. A sequence

● say for● take 12 =>● scan(● mk_seq( [2.5, 2, 2] ),● 10● );

Page 40: Functional Pe(a)rls

2. A sequence

●http://greenokapi.net/blog/ 2008/07/27/ 102550-sequence-fun/

Page 41: Functional Pe(a)rls

2. A sequence

●HOP::Stream●Scalar::Defer

Page 42: Functional Pe(a)rls

2. A sequence

●HOP::Stream●Data::Lazy

Page 43: Functional Pe(a)rls

2. A sequence

●HOP::Stream●Data::Thunk

Page 44: Functional Pe(a)rls

4. Laziness

●my $x = lazy { 1/0 };

Page 45: Functional Pe(a)rls

4. Laziness

●my $x = lazy { 1/0 };

● print $x; # OUCH!

Page 46: Functional Pe(a)rls

5. Concurrency

Hard

Page 47: Functional Pe(a)rls

5. Concurrency

Ugly

Page 48: Functional Pe(a)rls

5. Concurrency

futures (Java)

Page 49: Functional Pe(a)rls

5. Concurrency

parallel strategies (Haskell)

Page 50: Functional Pe(a)rls

5. Concurrency

●my $x = forked {● expensive_code();● };

Page 51: Functional Pe(a)rls

5. Concurrency

Lazy!

Page 52: Functional Pe(a)rls

5. Concurrency

●wait on child only if we ask for $x

Page 53: Functional Pe(a)rls

5. Concurrency

●my @list = map forked { ● sleep $_;● $_*2 ● }, 1..10;

Page 54: Functional Pe(a)rls

5. Concurrency

●after 1 sec “2”●after 2 sec “4”●after 3 sec “6”●...

Page 55: Functional Pe(a)rls

5. Concurrency

●sleep 5

Page 56: Functional Pe(a)rls

5. Concurrency

●sleep 5● (5 of the values are now ready)

Page 57: Functional Pe(a)rls

5. Concurrency

● sleep 5● say $_ for @list;

–2–4–6–8–10– ...

Page 58: Functional Pe(a)rls

5. Concurrency

● sleep 5● say $_ for @list;

–2–4–6–8–10– ... (block till @list finished)

Page 59: Functional Pe(a)rls

5. Concurrency

●Acme::Fork::Lazy

Page 60: Functional Pe(a)rls

5. Concurrency

●Data::Thunk (etc.)

Page 61: Functional Pe(a)rls

5. Concurrency

●YAML● (for marshalling)

Page 62: Functional Pe(a)rls

5. Concurrency

●forks

Page 63: Functional Pe(a)rls

5. Concurrency

●Problems?–retry on fail?– test if ready?–run only when preconditions ready?

Page 64: Functional Pe(a)rls

5. Concurrency

●Acme::Fork::Lazy

Page 65: Functional Pe(a)rls

5. Concurrency

●IO::Lambda

Page 66: Functional Pe(a)rls

Grazie