[Haskell-cafe] Picking out elements of a heterogenous list
David Roundy
droundy at darcs.net
Tue Dec 5 12:52:57 EST 2006
On Tue, Dec 05, 2006 at 11:08:07AM -0600, Creighton Hogg wrote:
> Hi Haskell-ers,
> So I think I understand the idea of creating a heterogenous list using
> typeclasses and existentials, but I don't see how to filter the list
> to retrieve elements of the list that are of only one type.
>
> More concretely, taking the example
> here<http://haskell.org/haskellwiki/Existential_type>how could we take
> a list of shapes [Shape] and pull out all objects that are
> Squares?
> I don't see an obvious way this makes sense.
> Is there a way of doing heterogenous lists that would make this possible?
It's ugly but you could stick converters in the class itself:
class MyClass a where
isTypeA :: a -> Maybe A
isTypeA _ = Nothing
isTypeB :: a -> Maybe B
isTypeB _ = Nothing
isTypeC :: a -> Maybe C
isTypeC _ = Nothing
This limits you to a finite number of specific types, but I suspect that's
unavoidable. Actually, your list can have any number of types in it, but
you can only extract a fixed set of types.
Another perhaps prettier way to do this would be to use an ADT to hold the
elements of your list, so that the existentials could be
reconstructed by pattern matching:
data FunnyElement = ElemA A | ElemB B | ElemC C
Again, it only works for lists containing a fixed set of types.
--
David Roundy
Department of Physics
Oregon State University
More information about the Haskell-Cafe
mailing list