On 12/20/2012 08:54 PM, Daniel Feltey wrote:
> You were only missing the restriction that both types a and b must be
> instances of Monoid in order to make Socket a b into an instance of Monoid.
> 
> 
> 
> Dan Feltey

Thank you for your help. An additional question, if I might: For the
sake of elegance and simplicity, I modified the class and instances to
avoid the "tuple" aspect:

code:
--------
data Socket2 a b = Socket2 a b
  deriving (Show)

instance (Monoid a, Monoid b) => Monoid (Socket2 a b) where
    mempty = Socket2 mempty mempty
    Socket2 a b `mappend` Socket2 w x = Socket2 (a `mappend` w) (b
`mappend` x)
--------

Of course, I thought it would be likely I would want other classes and
instances with additional numbers of types:

code:
--------
data Socket3 a b c = Socket3 a b c
  deriving (Show)

instance (Monoid a, Monoid b, Monoid c) => Monoid (Socket3 a b c) where
    mempty = Socket3 mempty mempty mempty
    Socket3 a b c `mappend` Socket3 w x y =
        Socket3 (a `mappend` w) (b `mappend` x) (c `mappend` y)

data Socket4 a b c d = Socket4 a b c d
  deriving (Show)

instance (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (Socket4 a b
c d) where
    mempty = Socket4 mempty mempty mempty mempty
    Socket4 a b c d `mappend` Socket4 w x y z =
        Socket4 (a `mappend` w) (b `mappend` x) (c `mappend` y) (d
`mappend` z)

data Socket 5 a b c d e... et cetera
--------

Seeing as the pattern here is so rigid and obvious, I was wondering: is
it possible to abstract this even more? So I could, for instance, just
specify that I want a Socket with 8 types, and poof, it would be there?
Or is this as meta as we get? (I.e., without going to something like
Template Haskell.)

-- 
frigidcode.com

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to