I am trying to name what I think is a new idea for a higher-order function. To the important part, here is the code in Python and Haskell to demonstrate the concept, which will
In Python the meld
equivalent is in the itertools receipes and called pairwise.
from itertools import starmap, izp, tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return izip(a, b)
So I would call it:
def pairwith(func, seq):
return starmap(func, pairwise(seq))
I think this makes sense because when you call it with the identity function, it simply returns pairs.
So because there seems to be no name for this I suggest 'merger' or simple 'merge' because you are merging adjacent values together.
So merge is already taken so I now suggest 'meld' (or 'merger' still but that may be too close to 'merge')
For example:
meld :: (a -> a -> b) -> [a] -> [b]
meld _ [] = []
meld f xs = zipWith f (init xs) (tail xs)
Which can be used as:
> meld (+) [1..10]
[3,5,7,9,11,13,15,17,19]
> meld compare "hello world"
[GT,LT,EQ,LT,GT,LT,GT,LT,GT,GT]
Where the second example makes no real sense but makes a cool example.
this seems like ruby's each_cons
ruby-1.9.2-p0 > (1..10).each_cons(2).to_a
=> [[1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]]
Nice idiom! I just needed to use this in Perl to determine the time between sequential events. Here's what I ended up with.
sub pinch(&@) {
my ( $f, @list ) = @_;
no strict "refs";
use vars qw( $a $b );
my $caller = caller;
local( *{$caller . "::a"} ) = \my $a;
local( *{$caller . "::b"} ) = \my $b;
my @res;
for ( my $i = 0; $i < @list - 1; ++$i ) {
$a = $list[$i];
$b = $list[$i + 1];
push( @res, $f->() );
}
wantarray ? @res : \@res;
}
print join( ",", pinch { $b - $a } qw( 1 2 3 4 5 6 7 ) ), $/;
# ==> 1,1,1,1,1,1
The implementation could probably be prettier if I'd made it dependent on List::Util, but... meh!