
inter :: (a -> a -> b) -> [a] -> [b] inter f [] = [] inter f l = map (uncurry f) $ zip l (tail l)
This is the same as
inter :: (a -> a -> b) -> [a] -> [b] inter f l = zipWith f l (tail l)
Except when l == [], but the second equation can be replaced by this nicer one.
and you can use it to define the good old Fibonacci sequence:
fibs = 0 : 1 : inter (+) fibs
Another use :-) (sorry Holger for duplicate -- hit wrong answer button at first) Together, these functions can be used to define a variant of groupBy that does the "expected thing" in the case of groupBy (<) for example. groupBy f l = gby $ zip (undefined : inter f l) l where gby [] = [] gby ((_,x):ps) = withPair (:) ((x:) . map snd) gby (span fst ps)
groupBy (<) [1,2,3, 2,3, 1,2] [[1,2,3],[2,3],[1,2]]
/Johan