[Haskell-cafe] Re: howto tuple fold to do n-ary cross product?

Larry Evans cppljevans at suddenlink.net
Sun Nov 30 13:04:18 EST 2008


On 11/30/08 11:30, Luke Palmer wrote:
> On Sun, Nov 30, 2008 at 10:25 AM, Larry Evans <cppljevans at suddenlink.net> wrote:
>> Is there some version of haskell, maybe template haskell,
>> that can do that, i.e. instead of:
>>
>>  cross::[[a]] -> [[a]]
>>
>> have:
>>
>>  crossn::[a0]->[a1]->...->[an] -> [(a0,a1,...,an)]
> 
> Ah yes!  This is straightforward usage of the list monad.  I suggest
> applicative notation:
> 
>   import Control.Applicative
>   (,,,) <$> xs0 <*> xs1 <*> xs2 <*> xs3
> 
> Or alternatively:
> 
>   import Control.Monad
>   liftM4 (,,,) xs0 xs1 xs2 xs3
> 
> (I would have used liftA4, but it's not defined.  The definition looks
> a lot like the first example :-)
> 
> This notation seems a bit magical, but you can build what you want
> using a simple binary cross:
> 
>   cross :: [a] -> [b] -> [(a,b)]
> 
> It's just kind of a pain  (you build [(a,(b,(c,d)))] and then flatten
> out the tuples).  The applicative notation is a neat little trick
> which does this work for you.

Thanks Luke.  I'll try that.

> 
> If you're asking whether crossn, as a single function which handles
> arbitrarily many arguments, can be defined, the short answer is "no".
> I dare you to come up with a case in which such function adds more
> than cursory convenience.

The following post:

   http://thread.gmane.org/gmane.comp.lib.boost.devel/182797

shows at least one person that would find it useful, at least in
c++.  Of course maybe it would be less useful in haskell.



More information about the Haskell-Cafe mailing list