Ashley Yakeley wrote:
Oh I do this all the time in HBase. I simply do this:
data Type a = MkType
getType :: a -> Type a getType _ = MkType
class (Bounded a) => FloatTraits a where epsilon :: a mantissaDigits :: Type a -> Int
Suffering from persecution mania, I prefer to know for sure that nobody never ever will pattern match on those a's. So I prefer to write: -- Values serving as type arguments type TypeArg a = a -> () -- Constant function as type argument typeArg :: TypeArg a typeArg = const () -- Extract type argument from value getTypeArg :: a -> TypeArg a getTypeArg _ = typeArg I start to use this style more agressively in Strafunski and the boilerplate gmaps. A side remark: Data.Dynamic does NOT use this style but rather Ashley's: ... typeOf :: a -> TypeRep ... which is a pitty because there is nothing in the type which prevents you from looking at a; its only in the comments. Every now and then I get this wrong.
The only annoyance is that you frequently have to write (MkType :: Type MyFloat). Syntactic sugar for _that_ would be useful.
On the other hand, supporting the above style with TypeArg's by an ADT, would make the whole thing entirely safe and transparent. -- Ralf Laemmel VU & CWI, Amsterdam, The Netherlands http://www.cs.vu.nl/~ralf/ http://www.cwi.nl/~ralf/