Weitere ähnliche Inhalte Ähnlich wie Functional Pearls 4 (YAPC::EU::2009 remix) (20) Kürzlich hochgeladen (20) Functional Pearls 4 (YAPC::EU::2009 remix)36. op (Bwahaha!) (+) Devel::Declare custom parser hook can inject code etc. 42. Op ('+') # Perl is none the wiser Tee hee! 68. add(5) # $left is bound to 5 ->(6); # 11 70. sub add { my $left = shift; return sub { my $right = shift; return $left + $right; } } 72. sub add { my $left = shift; return sub { my $right = shift; return $left + $right; } } 76. sub add ($left, $right) { return $left + $right; } 79. curry add ($left, $right) { return $left + $right; } 82. curry (bwahaha!) add ($left, $right) { return $left + $right; } 84. curry add { return ROUTINE unless @_; check_args(2, @_); my $f = sub { my $f = sub { ... } $f = $f->(shift) for @_; return $f; } 86. curry add { return ROUTINE unless @_ ; check_args(2, @_); my $f = sub { my $f = sub { ... } $f = $f->(shift) for @_; return $f; } 98. curry add { return ROUTINE unless @_; check_args(2 , @_); my $f = sub { my $f = sub { ... } $f = $f->(shift) for @_; return $f; } 101. curry add { return ROUTINE unless @_; check_args(2, @_); my $f = sub { my $f = sub { ... } $f = $f->(shift) for @_; return $f; } 162. Perl's $_ is a horrible hack around not doing currying properly 164. Perl's $_ is a horrible hack around not doing currying properly 165. Why am I still programming this silly language? ;-) 167. Perl's $_ is a horrible hack around not doing currying properly 168. Why am I still programming this silly language? ;-) 201. my $f2c = sub { op(*5/9)->( op(-32)->(shift)) }; 203. my $f2c = sub { op(*5/9)->( op(-32)->(shift)) }; 206. my $f2c = sub { op(*5/9) ->( op(-32) ->(shift)) }; 208. my $f2c = sub { op(*5/9) ->( op(-32) ->(shift)) }; 263. Sequencing my @seq = sub { my $x = 1 }, sub { my $y = 2 }, sub { my $z = $x * $y }, sub { say "$x * $y = $z" }; 264. Sequencing my @seq = sub { my $x = 1 }, sub { my $y = 2 }, sub { my $z = $x * $y }, sub { say "$x * $y = $z" }; # Global symbol "$x" requires explicit package name at ... 265. Nesting my $x = 1; my $y = 2; my $z = $x * $y; say “$x * $y = $z”; 266. Nesting sub { my $x = 1; sub { my $y = 2; sub { my $z = $x * $y; sub { say "$x * $y = $z"; }->() }->() }->() }->(); 267. Monadic programming is impractical in Perl... only because of syntactic issues – Mark Jason Dominus http://perl.plover.com/classes/fp/samples/slide027.html 272. mdo { my $x = mbind(1); my $y = mbind(2); my $z = mbind($x + $y); say “$x * $y = $z”; } 274. mdo { my $x = mbind(1); my $y = mbind(2); my $z = mbind($x + $y); say “$x * $y = $z”; } 288. mdo { mbind $x = 1; mbind $y = 2; mbind $z = $x + $y; say “$x * $y = $z”; } 290. mdo { mbind $x = 1; mbind $y = 2; mbind $z = $x + $y; say “$x * $y = $z”; } 292. mdo { mbind 1, sub { my $x = shift; mbind 2, sub { my $y = shift; mbind $x + $y, sub { my $z = shift; say “$x * $y = $z”; } ... 299. mdo { mbind 1, sub { my $x = shift; mbind 2, sub { my $y = shift; mbind $x + $y, sub { my $z = shift; say “$x * $y = $z”; } # adds a closing brace } 301. mdo { mbind 1, sub { my $x = shift; mbind 2, sub { my $y = shift; mbind $x + $y, sub { my $z = shift; say “$x * $y = $z”; } } # adds a closing brace } 303. mdo { mbind 1, sub { my $x = shift; mbind 2, sub { my $y = shift; mbind $x + $y, sub { my $z = shift; say “$x * $y = $z”; } } } # adds a closing brace } 305. mdo { mbind 1, sub { my $x = shift; mbind 2, sub { my $y = shift; mbind $x + $y, sub { my $z = shift; say “$x * $y = $z”; } } } } # closes block 307. mdo { mbind $x = 1; mbind $y = 2; mbind $z = $x + $y; say “$x * $y = $z”; } 314. mdo { mbind $x = 1; mbind $y = 2; mbind $z = $x + $y; say “$x * $y = $z”; } 316. mdo { mbind $x = 1; mbind $y = 2; mbind $z = $x + $y; say “$x * $y = $z”; } 318. mdo { mbind $x = 1 ; mbind $y = 2 ; mbind $z = $x + $y ; say “$x * $y = $z”; } 320. mdo { mbind $x = 1 ; mbind $y = 2 ; mbind $z = $x + $y ; say “$x * $y = $z”; } 323. mdo (Maybe) { mbind $FH = m_open('<', $file) ; mbind $line = <$FH> ; mbind $val = lookup(h, $line) ; say “Found $val!”; } 325. mdo (Maybe) { mbind $FH = m_open('<', $file) ; mbind $line = <$FH> ; mbind $val = lookup(h, $line) ; say “Found $val!”; } 326. Will give up if can't open file, read a line from it, or look it up in a hash 328. mdo (Maybe) { mbind $FH = m_open('<', $file) ; mbind $line = <$FH> ; mbind $val = lookup(h, $line) ; say “Found $val!”; } 331. Maybe $FH = open($file) $line = <$FH> $val = lookup ( $line ) say “Found $val” 332. Maybe $FH = open($file) $line = <$FH> $val = lookup ( $line ) say “Found $val” ? 336. List $x = [1..10] $y = [1..10] guard $x+$y == 10 say “$x+$y=10” 338. mdo { mbind $x = [1..10] ; mbind $y = [1..10] ; mbind guard $x+$y == 10 ; say “$x+$y=10”; } 341. mdo { mbind $x = [1..10] ; mbind $y = [1..10] ; mbind guard $x+$y == 10 ; say “$x+$y=10”; } 346. mdo { mbind $x = [1..10] ; mbind $y = [1..10] ; mbind guard $x+$y == 10 ; say “$x+$y=10”; } 350. mcomp ($x <- [1..10]; $y <- [1..10]; $x+y==10) { say “$x+$y=10” }