Tengo un tipo de datos que promociono a través de DataKinds en ghc 7.4.1 y una clase de tipo determinada que deseo usar para realizar operaciones específicas de tipo.Cómo crear instancias de clase de tipo de un tipo promocionado?
data Type = TInt32 | TInt64 | TInt16
class TypeTraits a where
...
Y entonces trato de crear instancias de clase de tipos de los tipos promovidas así:
instance TypeTraits TInt32 where
...
recibo errores del tipo siguiente:
Kind mis-match
The first argument of `TypeTraits' should have kind `*',
but `TInt32' has kind `Type'
In the instance declaration for `TypeTraits TInt32'
tratar de solucionar este problema mediante la especificación el tipo de 'a':
class TypeTraits (a :: Type) where
...
Kind mis-match
Expected kind `ArgKind', but `a' has kind `Type'
In the type `a -> String'
In the class declaration for `TypeTraits'
¿Qué podría poner exactamente en el área '...'? 'TInt32' no es un tipo habitado, por lo que no puede usar' a' solo en una posición de valor. Supongo que algo así como 'crazyThing :: TypeTraits a => SomeTypeConstructor a'? Me cuesta imaginar cómo algo así podría ser útil, aunque si realmente me estiro, puedo imaginar que sea útil * de alguna manera *. Tal vez. –
La idea era tener rasgos para cada una de las instancias. Así que no estoy buscando el valor, sino simplemente un marcador de posición para especificar la clase de tipo y, en consecuencia, la función que deseo elegir allí. por ejemplo: 'clase TypeTraits (a :: Type) donde escriba HType un sizeOf :: Proxy a -> Int' – Chetan