[Haskell-beginners] List Function

Joe Fredette jfredett at gmail.com
Wed Apr 29 22:48:42 EDT 2009


Occurs to me I said two ways, and only gave one, the one I gave was the 
tougher way. The easiest way is to use a list comprehension, viz:

    toPairs xs ys = [(x,y) | x <- xs, y <- ys]

This is nice and succint, you can think of it (assuming you're familiar 
with it) as set-builder notation. The '[' and ']' brackets are the set 
brackets '{' and '}'. '<-' is
roughly like the element symbol. You can even add constraints (called 
guards), like so:

   foo xs ys = [x / y | x <- xs, y <- ys, y /= 0]



Joe Fredette wrote:
> So, two ways you could do it.
>
> I assume your current function looks like:
>
>    toPairs :: [a] -> [a] -> [[a]]
>    toPairs [] _ = []
>    toPairs (x:xs) ls = (zip (\y -> (x,y)) ls) : (toPairs xs ls)
>
> This returns something like:
>
>    toPairs [1,2] [3,4] ===> [[(1,3),(1,4)],[(2,3),(2,4)]]
>
> We want a function that takes this list-of-lists to a list. We can 
> certainly see the type as:
>
>    foo :: [[a]] -> [a]
>
> `foo` would have to take all the elements of each list, and put it in 
> a new one. We know of a function which combines the elements of two 
> lists, (++)
> so really, our foo function would do:
>
> foo [] = []
> foo (x:xs) = x ++ foo xs
>
> concatenating all of the lists together in order. But this is just a 
> fold, we can call foo:
>
> foo = foldr (++) -- or foldl would work too.
>
> foldr is just the pattern above, abstracted away to a convenient 
> function.
>
> Of course, this function comes up all the time, so we have one in the 
> prelude, it's called. `concat`. and if you look up the source on 
> hoogle, I believe you'll find the above.
>
> Nathan Holden wrote:
>> I don't know what you'd call it. Is there a function in any of the 
>> basic functions that does this something like this:
>>
>> Sending two lists, [1,2,3] and [2,3,4] it would return 
>> [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]. I managed to 
>> code my way into returning a list of lists, which works. But it 
>> seemed like a very basic list/matrix function, so I honestly believe 
>> that the Haskell designers probably would've put it in.
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://www.haskell.org/mailman/listinfo/beginners
>>   
-------------- next part --------------
A non-text attachment was scrubbed...
Name: jfredett.vcf
Type: text/x-vcard
Size: 296 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/beginners/attachments/20090429/6e12a534/jfredett.vcf


More information about the Beginners mailing list