# Singular Type Constructor

**Simon Marlow
**
simonmar@microsoft.com

*Tue, 31 Jul 2001 09:55:47 +0100*

>* Consider:
*>*=20
*>* --
*>* data T a =3D T
*>* --
*>*=20
*>* Is there anything in the Prelude or a standard library that=20
*>* looks like=20
*>* this? Should there be? What should it be called? 'Singleton'?=20
*>* 'Reified'?=20
*>* 'T'?
*>*=20
*>* I looked but couldn't find anything. Such a simple type=20
*>* constructor is in=20
*>* fact very useful when you need to pass types around to=20
*>* disambiguate class=20
*>* instances. For instance:
*>*=20
*>* --
*>* class HasTypeName t where
*>* getTypeName :: T t -> String
*>* =09
*>* instance HasTypeName Int where
*>* getTypeName T =3D "Int"
*>* =09
*>* instance HasTypeName () where
*>* getTypeName T =3D "()"
*>*=20
*>* intName =3D getTypeName (T :: T Int)
*
The type T is undoubtedly useful, but I think the example you give isn't
a good one. It works perfectly well without the T data type:
class HasTypeName t where
getTypeName :: t -> String
=09
instance HasTypeName Int where
getTypeName _ =3D "Int"
=09
instance HasTypeName () where
getTypeName _ =3D "()"
=20
intName =3D getTypeName (undefined :: Int)
(this is just like the Typeable class in the Dynamic library, BTW)
Cheers,
Simon