Le 23 juil. 2013 10:54, "Costello, Roger L." <costello@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).

--
Jedaï