2012-03-08 28 views
8

Básicamente, dado {-# LANGUAGE PolymorphicKinds, ConstraintKinds, TypeFamilies #-} (y más, si es necesario), ¿el operador de nivel de tipo (~) trabaja en las expresiones de tipo de tipo Constraint? Traté de buscar en Google la respuesta, pero no tuve suerte.Igualdad en las restricciones

+1

La pregunta es extraña, pero se le preguntó bien. Por curiosidad, ¿qué harías con una restricción de igualdad? –

+0

@Daniel Wagner Estoy escribiendo un EDSL de paradigmas cruzados que usa un sistema de funciones genéricas, y, por diversas razones, no puedo hacer uso de clases de tipos directamente. Podría salirse con la suya sin usar esto, pero conduciría a tipos extremadamente torpes y posiblemente a algunas restricciones innecesarias –

Respuesta

6

Sí, es posible. Debido a que los tipos del tipo Constraint son conjuntos finitos de restricciones de tipo atómico, puede probar su igualdad muy fácilmente. Sin embargo, la extensión PolyKinds no es necesaria. Además, hay muy pocas situaciones en las que este tipo de igualdad realmente sería útil, porque no veo una forma práctica de pasar restricciones polimórficas como los argumentos c1, c2 a Bla, por lo que la igualdad de restricciones sería una tautología en todos los casos (Show ~ Show aquí):

{-# LANGUAGE ConstraintKinds, TypeFamilies #-} 

type Bla c1 c2 a = (c1 a, c2 a, c1 ~ c2) 

foo :: Bla Show Show a => a -> IO() 
foo = print 

main = foo "Bla" 
Cuestiones relacionadas