
On 11/30/08 11:30, Luke Palmer wrote:
On Sun, Nov 30, 2008 at 10:25 AM, Larry Evans
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.