[Haskell-cafe] defining mapPairs function

Devin Mullins twifkak at comcast.net
Thu Aug 30 10:05:44 EDT 2007


That's great (really, thank you for such a fun example of Arrow 
programming), but isn't the (*) on line two of mapPair supposed to be a 
"point"? How would you make a point-less version of mapPair that 
actually had the type signature (a->a->a)->[a]->[a]*? (For that matter, 
/would/ you?)

Devin
* Grr, you're right. Were it not for that odd requirement, the type 
could be loosened to (a->a->b)->[a]->[b]. Maybe mapPairs should take a 
monadic (that is, one-arg) function to handle the dangling oddies.

Dan Weston wrote:
> import Control.Arrow((&&&),(>>>))
> import Data.Maybe(catMaybes,maybeToList)
> 
> mapPair = (id &&& tail           >>>  -- offset list by one
>            uncurry (zipWith (*)) >>>  -- multiply adjacent
>            alternate             >>>  -- mark   even elements
>            catMaybes)                 -- delete even elements
> 
>                  &&&                  -- Tuple this up with...
> 
>           (alternate             >>>  -- keep odd indices
>            (Nothing:)            >>>  -- make sure there is a last
>            last                  >>>  -- get last
>            maybeToList)               -- keep if it had odd index
> 
>                  >>>                  -- and then...
> 
>           uncurry (++)                -- append pair of lists
> 
>   where alternate = zipWith ($) (cycle [Just,const Nothing])
>                   -- Mark even-indexed elements for deletion
>                   -- cycle goes on forever, but zipWith stops at
>                   -- the end of the shorter list, so no worries.


More information about the Haskell-Cafe mailing list