Adam Gundry wrote: [...] > To use standalone deriving, you need to write > >> deriving instance Show (Person gender) > > and everything will work fine. By writing > >> instance Show (Person gender) > > you are instead giving an instance with no methods, and the default > methods in the Show class contain a loop (so that one can define either > show or showsPrec).
Thanks a lot. I did not remember that "Standalone Deriving" has a meaning as a GHC extension. My idea was correct, but the employed syntax was incorrect. Just for reference (future Google search by others), the corresponding link in the GHC documentation: http://www.haskell.org/ghc/docs/7.6.2/html/users_guide/deriving.html > P.S. You might like to check out the new DataKinds extension, which > would allow Male and Female to be data constructors rather than type > constructors. Thanks a lot for pointing out this subject (it compells me to work on it - I am not an advanced user of GHC). I have just tried to understand all this stuff about type and data constructor promotion: http://www.haskell.org/ghc/docs/7.6.1/html/users_guide/promotion.html If I understand well, your idea is to avoid letting someone write: let a = Alive "Joe" 60 Dead :: Person Int which is nonsense (a Person cannot have a gender of type "Integer"), but legal code. I have tried to use the technique described at the beginning of the article "Given Haskell a Promotion", but I'm stuck. See the code below. My problem is that now Gender is a kind, no more a type, such that I cannot use it in the type definition of the GADT; but I am compelled to write something after "::", and I cannot write for instance "Dead :: Person Male" because I want a dead person to be either a man or woman, of course. In fact, what I need is Gender both as a type and as a kind, if I am correct? What do I miss? So the following version does not work: ---------------------------------------- {-# LANGUAGE GADTs #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE FlexibleInstances #-} data Gender = Male | Female data Person :: Gender -> * where Dead :: Person Gender -- WHAT DO I PUT HERE Alive :: { name :: String , weight :: Float , father :: Person Gender } -> Person Gender deriving instance Show (Person Gender) main = do let a = Alive "Joe" 60 Dead :: Person Male let b = Alive "Jim" 70 a :: Person Male print a print b ---------------------------------------- How to modify it? Thanks a lot, TP _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe