[Haskell-beginners] Typeclasses and "inheritance"

Patrick LeBoutillier patrick.leboutillier at gmail.com
Thu Jul 23 12:34:18 EDT 2009


Hi Brent,


> Think about what (show . host $ a) does.  It takes 'a', converts it
> to... any type which is an instance of IPHost, and then shows that,
> turning it into a String.  But there can be multiple types which are
> instances of IPHost, and each of them could have a *different* Show
> instance.  So the exact String you get out depends on what type you
> pick... but there's no way for Haskell to infer which type to use.
> This is why it suggests to add a type signature.  But I think there is
> probably some confusion that needs to be cleared up, the code you have
> doesn't quite make sense.  Here are some questions to ask yourself:
>
>  1. Do you really want to be able to have multiple instances for
>     IPHost and IPMask?  (The answer might legitimately be 'yes', I'm
>     just making sure.)  What sorts of types do you have in mind that
>     will be instances of these classes?


Yes. Basically my goal was to have something like:

data IPv4Host = IPv4Host Word32
                deriving (Show)
instance IPHost IPv4Host where

data IPv4Mask = IPv4Mask Word32
                deriving (Show)
instance IPMask IPv4Mask where

data IPv4Addr = IPv4Addr IPv4Host IPv4Mask
instance IPAddr IPv4Addr where

and the equivalent for IPv6 (to be implemented later when I fugre out how to
do it...)


>
>
>  2. Do you really intend for the 'host' and 'mask' methods of the
>     IPAddr class to be able to return *any* types which are instances
>     of IPHost and IPMask, respectively? (This is what the code says
>     right now.)  This is actually impossible given that IPHost and
>     IPMask have no methods.  Or do you mean that for a given instance
>     of IPAddr, the 'host' method (say) will return some *particular*
>     type which happens to be an instance of IPHost, but which type is
>     returned may differ between instances of IPAddr?


Yes! That's exactly what I want (and yes there will be methods eventually in
those classes)


> If that's
>     really what you mean, I would suggest either using a
>     multi-parameter type class, like so:
>
>       class (IPHost h, IPMask m) => IPAddr a h m where
>         host :: a -> h
>         mask :: a -> m


Ok... So I guess the instance declaration for IPv4Addr will then become
this:

   instance IPAddr IPv4Addr IPv4Host IPv4Mask where

but how do I adjust the showIPAddr function to deal with that? I tried this:

   showIPAddr :: (IPAddr a h m) => a -> String

but something is still missing, I get:

    Could not deduce (IPAddr a b m) from the context (IPAddr a h1 m1)
      arising from a use of `host' at IP.hs:23:23-26
    Possible fix:
      add (IPAddr a b m) to the context of
        the type signature for `showIPAddr'
    In the second argument of `(.)', namely `host'
    In the first argument of `($)', namely `show . host'
    In the first argument of `(++)', namely `(show . host $ a)'


Thanks a lot,

Patrick



>
>
>     OR using existential quantification to hide the particular types
>     returned by 'host' and 'mask'.
>
> -Brent
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>



-- 
=====================
Patrick LeBoutillier
Rosemère, Québec, Canada
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20090723/119d66fc/attachment.html


More information about the Beginners mailing list