I've constructed a "listProduct" function that I think I've seen somewhere else... is it a standard function? If so, where is it defined?

My code is:
[[
-- |Given a list of lists, construct a new list of lists where
--  each member of the new list is the same length as the original
--  list, and each member corresponds to a different choice of
--  one element from each of the original members in the
--  corresponding position.  Thus:
--
--  listProduct [[a1,a2],[b1],[c1,c2]] =
--       [ [a1,b1,c1], [a1,b1,c2], [a2,b1,c1], [a2,b1,c2] ]
--
--  Note:  The length of the resulting list is the product of
--  lengths of the components of the original list.  Thus, if
--  any member of the original list is empty then so is the
--  resulting list:
--
--  listProduct [[a1,a2],[],[c1,c2]] = []
--
listProduct :: [[a]] -> [[a]]
listProduct []       = [[]]
listProduct (as:ass) = concat [ map (a:) (listProduct ass) | a <- as ]

test1 = listProduct [["a1","a2"],["b1"],["c1","c2"]]
test2 = listProduct [["a1","a2"],[],["c1","c2"]]
]]

And a supplementary point. Following a comment made to me previously, I can replace this list comprehension (not having any guard expressions) with another map function, thus:

[[
lp []       = [[]]
lp (as:ass) = concatMap (\a -> (map (a:) (lp ass))) as
]]

I think I should also be able to eliminate the lambda-abstraction, but I can't see how. I prefer the list comprehension, as I find that easier to read than the \-expression.

#g


------------ Graham Klyne For email: http://www.ninebynine.org/#Contact

_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to