[Haskell-beginners] How to best handle classes of types, interactions and listing of different types?

Daniel Bergey bergey at alum.mit.edu
Tue May 24 20:15:13 UTC 2016


On 2016-05-23 at 12:06, Silent Leaf <silent.leaf0 at gmail.com> wrote:
> Say there's a class, many types that can instantiate it. Then, i in fact need to be able
> to concatenate (mappend would be ideal!), make lists of values of different types, all
> instantiating the class.

In most cases, when Haskell beginners want to make a list that contains
several types from a single type class, there's a better way to organize
the code.  If you post your code, I'll try to suggest a specific
solution.

In general, try to find a simple data type that captures the same fields
& functions as an unknown type that is part of the type class.  Here's
an example.

We have a type class for vectors in a metric space, and instances for
2D, 3D, etc.

> class Metric v where
>     length :: v -> Double
>     (*^) :: Double -> v -> v

This class has the law:  s * length v == length (s *^ v)

Instead of a heterogeneous list [ V2 1 2, V3 3 4 5, V4 6 7 8 9], we make
a list that just has the length of each vector, and lets us multiply
those lengths by a scalar.  In this case, we don't even need to write a
new data type, the type is simply Double.  We can write:

> [ length (V2 1 2), length (V3 3 4 5), length (V4 6 7 8 9) ]

And (*) gives us what Metric does with (*^).  Of course, with your
class, it's probably not so obvious how to transform the class this way.

It's certainly possible to make a record with functions as members,
moving in the object-oriented direction.  Existential types (with a
class constraint inside the data constructor) are even more rarely used.

cheers,
bergey


More information about the Beginners mailing list