On 11/30/08 11:30, Luke Palmer wrote:
On Sun, Nov 30, 2008 at 10:25 AM, Larry Evans <[EMAIL PROTECTED]> 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.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe