
On Feb 6, 2008 9:40 AM, Henning Thielemann
On Wed, 6 Feb 2008, Denis Bueno wrote:
On Feb 6, 2008 9:00 AM, Henning Thielemann
wrote: On Wed, 6 Feb 2008, Matthew Pocock wrote:
class Buildable b where empty :: b a --makes an empty b with elements of type a insert :: a -> b a -> b a --inserts the new element into the buildable
How can this interface be used both for lists and maps? [...]
One solution is to change the class slightly:
class Buildable t x where empty :: t insert :: x -> t -> t
instance Buildable (Map k a) (k, a) where empty = Map.empty insert = uncurry Map.insert
ok, maybe with functional dependency t -> x
I'm not sure about that. It's often convenient to have two instances, one like the one I gave above, and others involving something that embeds a key-value pair: type SomethingWithKV k a = KV {getKV :: (k, a)} instance Buildable (Map k a) (SomethingWithKV k a) where empty = Map.empty insert s m = uncurry Map.insert (getKV s) m I have done this before -- it's very convenient, and I think makes the code that uses empty and insert more robust, and easier to read. -- Denis