
On Fri, Jun 5, 2009 at 7:09 PM, Sean Bartell
by_type :: Storage a => String -> String -> IO a This function must, for any Storage type, take any two strings and produce an IO value of that type. (by_type "disk" "xyz" :: Memory must be valid.) It doesn't really have the option of choosing which instance of Storage to use.
In pure Haskell, you would probably have to do something like type Storage = Disk Handle | Memory String by_type :: String -> String -> Storage That way, by_type can return any Storage it wants.
I'm sure there are also ways to do what you want with extensions.
I think the point is to be able to extend the storage methods in another module ? If not, Sean's solution is what you want. If you want to use the type class to allow anyone to add a new method in his own module, you can use existential type, like :
data Store = forall a . Storage a => Store a
and then your byType :
byType "disk" x = Store (open x :: Disk) byType "memory" x = Store (open x :: Memory)
See XMonad and its Layout type for an example of this method. -- Jedaï