Send Beginners mailing list submissions to beginners@haskell.org To subscribe or unsubscribe via the World Wide Web, visit http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners or, via email, send a message with subject or body 'help' to beginners-requ...@haskell.org
You can reach the person managing the list at beginners-ow...@haskell.org When replying, please edit your Subject line so it is more specific than "Re: Contents of Beginners digest..." Today's Topics: 1. Re: How to best handle classes of types, interactions and listing of different types? (Daniel Bergey) ---------------------------------------------------------------------- Message: 1 Date: Tue, 24 May 2016 16:15:13 -0400 From: Daniel Bergey <ber...@alum.mit.edu> To: Silent Leaf <silent.le...@gmail.com>, The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: Re: [Haskell-beginners] How to best handle classes of types, interactions and listing of different types? Message-ID: <87r3crxlf2.fsf@chladni.i-did-not-set--mail-host-address--so-tickle-me> Content-Type: text/plain On 2016-05-23 at 12:06, Silent Leaf <silent.le...@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 ------------------------------ Subject: Digest Footer _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ End of Beginners Digest, Vol 95, Issue 30 *****************************************