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

Chaddaï Fouché chaddai.fouche at gmail.com
Tue Jul 23 21:12:51 CEST 2013

Le 23 juil. 2013 10:54, "Costello, Roger L." <costello at mitre.org> a écrit :
> 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?

This is pretty normal since there are no elements in "g xs" so b can takes
no values. You have got some excellent answers on that but I think your
problem is more fundamental :

> f x = x

This function does nothing or more precisely it is the identity, you can
replace "f anything" by "anything" and have exactly the same result.

> g x = []

This function just takes anything and returns an empty list. So

> [(a,b) | a <- f xs, b <- g xs]

Is exactly the same as :

> [(a,b) | a <- xs, b <- [] ]

If xs is ["a"] that becomes

> [(a,b) | a <- ["a"], b <- [] ]

I think those f and g didn't work like that in your mind so could you
explain what you thought they should do (with some examples maybe).

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130723/0515b03e/attachment.htm>

More information about the Beginners mailing list