Alex Jacobson wrote:
Consider this module for a blog entry that I will want to put in various generic collections that require Ord
{-# OPTIONS -fglasgow-exts #-} module Blog.Types where import Data.Typeable import Data.Generics
data BlogEntry = Entry EpochSeconds Name Email Title Body deriving (Eq,Ord,Read,Show,Typeable)
newtype Name = Name String deriving (Eq,Ord,Read,Show,Typeable) newtype Title = Title String deriving (Eq,Ord,Read,Show,Typeable) newtype Body = Body String deriving (Eq,Ord,Read,Show,Typeable)
It seems really unnecessarily verbose. Having to add the OPTION header AND import Data.Typeable and Data.Generics just to derive Typeable is a beat-down.
It works for me removing the Data.Generics import - I think that's just for generics/deriving Data, which is different from Typeable.
It is even more of a beat-down to have to add a deriving clause for every newtype to make this all work nicely. Is there a way to make all types automatically derive everything unless there is an explicit instance declaration otherwise?
No, not with separate compilation, not in a practical way anyway. And sometimes you don't _want_ a newtype to be an instance of those classes that the inside type is instances of (for abstraction/encapsulation).
{-# OPTIONS -fglasgow-exts -fgenerics -fderiving#-} module Blog.Types where
data BlogEntry = Entry EpochSeconds Name Email Title Body newtype Name = Name String newtype Title = Title String newtype Body = Body String Isn't that much nicer?
A little nicer, but wouldn't you like to get rid of those words "newtype" and duplicate names too? >:) (For your second, desired code sample, I have a feeling this is where DrIFT or Data.Derive are going to come in... I'm not going to mention those external things!) Isaac