
On Tue, May 28, 2013 at 07:36:13AM +0000, harry wrote:
Every OO language which supports generics allows a declaration such as List<Show> alist, where Show is an interface. Any type implementing Show can be put in alist, and any Show operation can be performed on the alist's members. No casts, wrappers, or other special types and plumbing are needed.
Why isn't it possible to do this directly in Haskell?
I am not sure what you mean by asking "why". If you are simply implying that this is stupid and Haskell *should* be able to do this directly, then I would say that you need to spend more time learning to think through the lens of the abstractions Haskell *does* give you, and stop trying to think through an OOP lens. I can count on one finger the number of times I have wanted a heterogeneous collection like this --- it was a long time ago, and I was wrong. On the other hand, if you sincerely want to know why, it is simply that this kind of feature does not fit nicely within the space of the design decisions that were made when creating Haskell, for example: (1) All the elements of a list must have the same type. (2) A type class cannot be used as a type. (3) Haskell has no subtyping. And there are good reasons behind these decisions as well. For example, subtyping makes type inference nigh impossible. -Brent