[Haskell-beginners] Why does this list comprehension return an empty list?

Emanuel Koczwara poczta at emanuelkoczwara.pl
Tue Jul 23 11:12:23 CEST 2013


Hi,

Dnia 2013-07-23, wto o godzinie 08:53 +0000, Costello, Roger L. pisze: 
> Hi Folks,
> 
> I have a list of singletons:
> 
> 	xs = [("a")]
> 
> f is a function that, given an argument x, it returns the argument:
> 
> 	f x = x
> 
> g is a function that, given an argument x, it returns the empty list:
> 
> 	g x = []
> 
> I have a list comprehension that extracts the singletons from xs using f and g, and creates a pair from their output:
> 
> 	[(a,b) | a <- f xs, b <- g xs]
> 
> I executed this and the result is the empty list:
> 
> 	[]
> 
> That is odd. Why is the empty list the result?
> 

Becouse g xs has zero elements. Look at this example:

[(x,x) | x <- []] => []

Empty list has zero elements.

> Consider this list comprehension that extracts the singletons from xs using f only, and creates a pair by matching up the singleton from xs with the empty list:
> 
> 	[(a,[]) | a <- f xs]
> 
> The result is this:
> 
> 	[("a",[])]
> 
> That is the result that I expected to get with the first list comprehension. 
> 
> Would you explain why this:
> 
> 	[(a,b) | a <- f xs, b <- g xs]
> 
> yields [], whereas this:
> 
> 	[(a,[]) | a <- f xs]
> 
> yields [("a",[])]?
> 
> Also, how would I modify this:
> 
> 	[(a,b) | a <- f xs, b <- g xs]
> 
> so that it produces this:
> 
> 	[("a",[])]

Define g as:

g xs = [[]]

or maybe better:

g _ = [[]]

Now it has 1 element - empty list.

Best regards,
Emanuel

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 5185 bytes
Desc: not available
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130723/beb6595b/attachment.bin>


More information about the Beginners mailing list