in reply to Re: the next step
in thread the next step
You can get pretty much the same techniques out of Haskell, but you'll miss currying.
Huh? Haskell's curried...
then print (y "banana") prints "<banana>". BTW, if you haven't, you should definitely check out Haskell, as it can be a truly mind-bending experience. It's easy to get up and running with the HUGS interpreter, now with delicious readline support.foo a b c = a ++ c ++ b with_parens a b = foo a b y = with_parens "<" ">"
/s
Update: you won't miss the currying anymore...
use strict; use Carp; use Attribute::Handlers; sub _curry { my ($n, $func, @args) = @_; return sub { my $narg = @args + @_; if ($narg > $n) { carp "$narg args to curried function (expects $n)."; } elsif ($narg < $n) { return _curry($n, $func, @args, @_); } else { return &$func(@args, @_); } }; } sub curry : ATTR(CODE) { my ($package, $symbol, $code, $name, $n) = @_; confess "Usage: sub mysub : curry(N), where N > 0" unless $n; local($^W) = 0; no strict 'refs'; my $newsub = _curry($n, $code); *{$package . '::' . *{$symbol}{NAME}} = $newsub; } sub foo :curry(3) { print "foo: @_\n"; } my $x = foo(1,2); &$x(3); &$x(2);
|
---|
In Section
Meditations