2012-04-23 11 views
6

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' 
+0

¿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. –

+0

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

Respuesta

7

El problema está en el cuerpo de la clase; los tipos que tienen un tipo elevado no tienen ningún valor, por lo que no puede tener una función que tome uno como parámetro. Deberá usar Proxy a -> String o similar.

Por cierto, si activa la extensión PolyKinds, entonces debería poder omitir la anotación tipo por completo. (De hecho, puede que tenga que hacer esto para definir su propio tipo Proxy, ya que creo que el de Data.Proxy podría ser * -> *, mientras que necesita Type -> *. Si define data Proxy p = Proxy con PolyKinds en adelante, se deducirá como AnyK -> *.)

+1

El tipo de datos Proxy en [paper] (http://research.microsoft.com/en-us/ people/dimitris/fc-kind-poly.pdf) finalmente tiene sentido, ¡gracias! – Chetan

Cuestiones relacionadas