Top Banner
FUNCTIONAL PE(A)RLS YAPC::EU::2014 София @osfameron Huey’s Zipper http://marinaneira.deviantart.com/art/Huey-Duck-317018337
111

Functional pe(a)rls: Huey's zipper

Jan 11, 2015

Download

Technology

osfameron

2014 edition of the Functional Pe(a)rls series, this time on purely functional Zippers with Moo, and self-balancing AA trees.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Functional pe(a)rls: Huey's zipper

FUNCTIONAL PE(A)RLSYAPC::EU::2014 София

@osfameron

Huey’s Zipper

http://marinaneira.deviantart.com/art/Huey-Duck-317018337

Page 2: Functional pe(a)rls: Huey's zipper

FUNCTIONAL PE(A)RLS WORLD TOUR

IPW 2008, Pisa map/grep, lazy iterators, currying, Devel::Declar for pretty syntax, Concurrency (Acme::Fork::Lazy)

LPW 2008, London much of above, Monad tutorial, Devel::Declare, Imperative programming in Pure Perl!

NWE.pm May 2009, Manchester as above, possibly also pattern matching?

YAPC::EU 2009, Lisbon functions, operators, Devel::Declare, sections, partial application, Sub::Curried, composition

IPW 2011, Turin purely functional data structures, linked lists,

http://www.slideshare.net/osfameron/

Page 3: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/qiaomeng/5540694558/

Page 4: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/hoyvinmayvin/4686704193/

Page 5: Functional pe(a)rls: Huey's zipper

IN THE BLUE CORNER…

Mutable

my $x = 10;

$x = 20;

Immutable

my $x = 10;

my $x2 = 20;

Page 6: Functional pe(a)rls: Huey's zipper

AND IN THE RED CORNER…

Mutable

sub c2f {my $temp=shift;$temp *= 9;$temp /= 5;$temp += 32;return $temp;

}

Immutable

sub c2f {my $c=shift;my $t1 = $c * 9;my $t2 = $t1 / 5;my $f = $t2 + 32;return $f;

}

Page 7: Functional pe(a)rls: Huey's zipper

AND IN THE RED CORNER… (redux)

Mutable

sub c2f {my $temp=shift;$temp *= 9/5;$temp += 32;return $temp;

}

Immutable

sub c2f {my $c = shift;return (

($c * 9/5)+ 32

)}

Page 8: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/redvers/532076662/

Page 9: Functional pe(a)rls: Huey's zipper

MUTABLE… CONSTANTS?

1 = 2;

say 1 + 1; # 4

Page 10: Functional pe(a)rls: Huey's zipper

ACTION AT A DISTANCE

my $one = 1;

sub bad_mutation {$one++;

}

sub naïve_expectations {say $one + $one; # 2? Or 4, 6, 10, etc.?

}

Page 11: Functional pe(a)rls: Huey's zipper

CONSTANTS

use constant ONE => 1;

sub on_the_defensive {say ONE + ONE; # 2

}

Page 12: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/jans_world/8985026701/

Page 13: Functional pe(a)rls: Huey's zipper

IMMUTABLE DATA STRUCTURES…

my $users = { … };

my $users_with_addresses = frobnicate($users);

send_emails($users_with_addresses);

sub send_emails {my $in = shift;my $intermediate = doozle($in);…return $out

}

Page 14: Functional pe(a)rls: Huey's zipper

IMMUTABLE DATA STRUCTURES…

my $users = { … };

my $users_with_addresses = frobnicate($users);

send_emails($users_with_addresses);

sub send_emails {my $in = shift;my $intermediate = doozle($in);…return $out

}

Page 15: Functional pe(a)rls: Huey's zipper

IMMUTABLE DATA STRUCTURES…

my $users = { … };

my $users_with_addresses = frobnicate($users);

send_emails($users_with_addresses);

sub send_emails {my $in = shift;my $intermediate = doozle($in);…return $out

}

Page 16: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/light_seeker/7571188852/

Page 17: Functional pe(a)rls: Huey's zipper

READONLY VARIABLES

use Const::Fast;

sub wibble {const my $in => shift;const my $out => $in * 2;return $out;

}

Page 18: Functional pe(a)rls: Huey's zipper

READONLY VARIABLES

const my %hash => (foo => {

bar => 1}

);

$hash{foo}{bar} = 2; # tee hee hee

Page 19: Functional pe(a)rls: Huey's zipper

READONLY VARIABLES

const my %hash => (foo => {

bar => 1}

);

$hash{foo}{bar} = 2;

# Modification of a read-only value attempted

Page 20: Functional pe(a)rls: Huey's zipper

COPIES OF VARIABLES?

Mutable

sub c2f {my $temp=shift;$temp *= 9;$temp /= 5;$temp += 32;return $temp;

}

Immutable

sub c2f {my $c=shift;my $t1 = $c * 9;my $t2 = $t1 / 5;my $f = $t2 + 32;return $f;

}

Page 21: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/historiska/13619294395

Page 22: Functional pe(a)rls: Huey's zipper

CREATURE COMFORTS

package Creature;

use Moo;

use Types::Standard ‘:all’;

has name => ( is => ‘ro’, isa => Str );

has type => ( is => ‘ro’, isa => Str );

has height => ( is => ‘ro’, isa => Num );

Page 23: Functional pe(a)rls: Huey's zipper

IF IT QUACKS LIKE A DUCK

use Creature;

my $donald = Creature->new(name => ‘Donald’,type => ‘duck’,height => 50, # cm

);

Page 24: Functional pe(a)rls: Huey's zipper

RESEARCH

http://wiki.answers.com/Q/How_tall_is_Donald_duck

Page 25: Functional pe(a)rls: Huey's zipper

RESEARCH

https://www.google.co.uk/search?q=2+feet+in+cm

Page 26: Functional pe(a)rls: Huey's zipper

LET’S JUST CHANGE THAT THEN, OH…

$donald->height( 60.96 );

Page 27: Functional pe(a)rls: Huey's zipper

CREATURE COMFORTS

package Creature;

use Moo;

use Types::Standard ‘:all’;

has name => ( is => ‘ro’, isa => Str );

has type => ( is => ‘ro’, isa => Str );

has height => ( is => ‘ro’, isa => Num );

Page 28: Functional pe(a)rls: Huey's zipper

CHAINED COPY…

# using MooseX::Attribute::ChainedClone

my $donald2 = $donald->height( 60.96 );

Page 29: Functional pe(a)rls: Huey's zipper
Page 30: Functional pe(a)rls: Huey's zipper
Page 31: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/dps/7161557/

Page 32: Functional pe(a)rls: Huey's zipper

CHAINED COPY…

# using MooseX::Attribute::ChainedClone

my $donald2 = $donald->height( 60.96 );

Page 33: Functional pe(a)rls: Huey's zipper

MooX::But

package MooX::But;

use Moo::Role;

sub but {

my $self = shift;

return $self->new(%$self, @_);

}

# see https://github.com/haarg/MooX-CloneWith

Page 34: Functional pe(a)rls: Huey's zipper

CHAINED COPY…

my $donald2 = $donald->but( height => 60.96 );

Page 35: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/randar/10337132166/

Page 36: Functional pe(a)rls: Huey's zipper

I’LL BE A MONKEY’S UNCLE

package Creature;

use Moo;

use Types::Standard ‘:all’;

has name => ( is => ‘ro’, isa => Str );

has type => ( is => ‘ro’, isa => Str );

has height => ( is => ‘ro’, isa => Num );

has uncle => ( is => ‘ro’,isa => InstanceOf[‘Creature’] );

Page 37: Functional pe(a)rls: Huey's zipper
Page 38: Functional pe(a)rls: Huey's zipper

COMPLEX CHAINED COPIES…

Mutable

$donald->uncle->height(52);

Immutable

$donald->uncle->but(height => 52

);

Page 39: Functional pe(a)rls: Huey's zipper

COMPLEX CHAINED COPIES…

Mutable

$donald->uncle->height(52);

Immutable

my … = $donald->uncle->but(height => 52

);

Page 40: Functional pe(a)rls: Huey's zipper
Page 41: Functional pe(a)rls: Huey's zipper
Page 42: Functional pe(a)rls: Huey's zipper
Page 43: Functional pe(a)rls: Huey's zipper

COMPLEX CHAINED COPIES…

my $donald2 = $donald->but(uncle => $donald->uncle->but(

height => 52)

);

Page 44: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/81583603@N00/4099146279/

Page 45: Functional pe(a)rls: Huey's zipper
Page 46: Functional pe(a)rls: Huey's zipper

EVEN MOAR COMPLEX CHAINED COPIES…

my $huey = $huey->but(uncle => $huey->uncle->but(

uncle => $huey->uncle->uncle->but(height => 52,

))

);

Page 47: Functional pe(a)rls: Huey's zipper

https://en.wikipedia.org/wiki/Clan_McDuck#Family_tree

Page 48: Functional pe(a)rls: Huey's zipper

http://pixdaus.com/super-squirrel-squirrel/items/view/97702/

Page 49: Functional pe(a)rls: Huey's zipper

THE ZIPPER

my $zipper = $huey->zip;

Page 50: Functional pe(a)rls: Huey's zipper
Page 51: Functional pe(a)rls: Huey's zipper
Page 52: Functional pe(a)rls: Huey's zipper

THE ZIPPER

my $zipper = $huey->zip->go(‘uncle’);

Page 53: Functional pe(a)rls: Huey's zipper
Page 54: Functional pe(a)rls: Huey's zipper

THE ZIPPER

my $zipper = $huey->zip->go(‘uncle’)->go(‘uncle’);

Page 55: Functional pe(a)rls: Huey's zipper
Page 56: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/nics_events/2349632625/

Page 57: Functional pe(a)rls: Huey's zipper

MODIFYING “IN-PLACE”

my $zipper = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 );

Page 58: Functional pe(a)rls: Huey's zipper
Page 59: Functional pe(a)rls: Huey's zipper

BACK UP THE ZIPPER

my $zipper = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 )->up;

Page 60: Functional pe(a)rls: Huey's zipper
Page 61: Functional pe(a)rls: Huey's zipper

BACK UP THE ZIPPER

my $zipper = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 )->up->up;

Page 62: Functional pe(a)rls: Huey's zipper
Page 63: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/123755251@N04/13969035991

Page 64: Functional pe(a)rls: Huey's zipper

UNZIPPING

my $huey2 = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 )->up->up->unzip;

Page 65: Functional pe(a)rls: Huey's zipper
Page 66: Functional pe(a)rls: Huey's zipper
Page 67: Functional pe(a)rls: Huey's zipper

UNZIPPING

my $huey2 = $huey->zip->go(‘uncle’)->go(‘uncle’)->set( height => 51 )->up->up->unzip;

Page 68: Functional pe(a)rls: Huey's zipper

UNZIPPING

my $huey2 = $huey->zip->dive(‘uncle’, ‘uncle’)->set( height => 51 )->unzip;

Page 69: Functional pe(a)rls: Huey's zipper

UNZIPPING

my $huey2 = $huey->doZipper( sub { $_->dive(‘uncle’, ‘uncle’)->set( height => 51 ) } );

Page 70: Functional pe(a)rls: Huey's zipper

REMATCH

Mutable

$huey->uncle->uncle->height(51);

Immutable

my $huey2 = $huey->doZipper(sub {

$_->uncle->uncle->set(height=>51)

});

Page 71: Functional pe(a)rls: Huey's zipper

REMATCH

Mutable

$huey->uncle->uncle->height(51);

Immutable

my $huey2 = $huey->doZipper(sub {

$_->uncle->uncle->set(height=>51)

});

Page 72: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/phunk/1460508385/

Page 73: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/mukumbura/3845329580/

Page 74: Functional pe(a)rls: Huey's zipper
Page 75: Functional pe(a)rls: Huey's zipper
Page 76: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/93081182@N02/12853918764/

Page 77: Functional pe(a)rls: Huey's zipper
Page 78: Functional pe(a)rls: Huey's zipper
Page 79: Functional pe(a)rls: Huey's zipper
Page 80: Functional pe(a)rls: Huey's zipper
Page 81: Functional pe(a)rls: Huey's zipper
Page 82: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/intherough/3470183543/

Page 83: Functional pe(a)rls: Huey's zipper
Page 84: Functional pe(a)rls: Huey's zipper
Page 85: Functional pe(a)rls: Huey's zipper
Page 86: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/ruthanddave/1760267748/

Page 87: Functional pe(a)rls: Huey's zipper

RED BLACK TREES

https://en.wikipedia.org/wiki/Red%E2%80%93black_tree

Page 88: Functional pe(a)rls: Huey's zipper
Page 89: Functional pe(a)rls: Huey's zipper
Page 90: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/bunnyrel/3970251151/

Page 91: Functional pe(a)rls: Huey's zipper
Page 92: Functional pe(a)rls: Huey's zipper

TYPICAL RED-BLACK TREE CASES

https://en.wikipedia.org/wiki/AA_tree

Page 93: Functional pe(a)rls: Huey's zipper
Page 94: Functional pe(a)rls: Huey's zipper

http://www.quickmeme.com/Engineering-Professor/page/43/

Page 95: Functional pe(a)rls: Huey's zipper

AA TREE CASES

https://en.wikipedia.org/wiki/AA_tree

Page 96: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/wwarby/7127632463/

Page 97: Functional pe(a)rls: Huey's zipper

BALANCING ROTATIONS

Skew Split

Page 98: Functional pe(a)rls: Huey's zipper

ZIPPER WITHIN AA-TREE CODE

# split

return $R->but(

left => $self->but(

right => $R->left,

),

level => $R->level + 1,

);

Page 99: Functional pe(a)rls: Huey's zipper

ZIPPER WITHIN AA-TREE CODE

# split

return $R->but(

left => $self->but(

right => $R->left,

),

level => $R->level + 1,

);

Page 100: Functional pe(a)rls: Huey's zipper

ZIPPER WITHIN AA-TREE CODE

# split

return $R->zip

->set( level => $R->level + 1)

->left->set( right => $R->left )

->unzip;

Page 101: Functional pe(a)rls: Huey's zipper

ZIPPER WITHIN AA-TREE CODE

# split

return $R->zip

->inc(‘level’)

->left->set( right => $R->left )

->unzip;

Page 102: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/jimmiehomeschoolmom/5066802611

Page 103: Functional pe(a)rls: Huey's zipper

ZIPPER WITHIN AA-TREE CODE

# in delete

$tree = $tree->zip

->set( level => $min_level )

->right->set( level => $min_level2 )

->top->skew->right->skew->right->skew

->top->split->right->split

->unzip;

Page 104: Functional pe(a)rls: Huey's zipper

ZIPPER WITHIN AA-TREE CODE

# in delete

$tree = $tree->zip

->set( level => $min_level )

->right->set( level => $min_level2 )

->top->skew->right->skew->right->skew

->top->split->right->split

->unzip;

Page 105: Functional pe(a)rls: Huey's zipper

ZIPPER WITHIN AA-TREE CODE

# in delete

$tree = $tree->zip

->set( level => $min_level )

->go(‘right’)->set( level => $min_level2 )

->top->skew->go(‘right’)->skew->go (‘right’)->skew

->top->split->go(‘right’)->split

->unzip;

Page 106: Functional pe(a)rls: Huey's zipper

ZIPPER WITHIN AA-TREE CODE

# in delete

$tree = $tree->zip

->set( level => $min_level )

->right->set( level => $min_level2 )

->top->skew->right->skew->right->skew

->top->split->right->split

->unzip;

Page 107: Functional pe(a)rls: Huey's zipper
Page 108: Functional pe(a)rls: Huey's zipper
Page 109: Functional pe(a)rls: Huey's zipper

LendingMemo.com - https://www.flickr.com/photos/lendingmemo/11702093735/

Page 110: Functional pe(a)rls: Huey's zipper
Page 111: Functional pe(a)rls: Huey's zipper

https://www.flickr.com/photos/wwworks/4759535950/