2012-04-30 11 views
9

Encontré un problema extraño al definir una restricción predeterminada. Si una restricción es una unidad, la instancia predeterminada no se elige. En todos los demás casos, funciona como se esperaba.Los tipos de restricción predeterminados se ignoran

{-# LANGUAGE TypeFamilies, ConstraintKinds #-} 
import qualified GHC.Exts as E 

class Expression a where 
    type Constr a v :: E.Constraint 
    --type Constr a v =()   -- with this line compilation fails 
    --type Constr a v = v ~ v  -- compiles 
    wrap :: Constr a v => a -> Maybe v 

instance Expression() where 
    wrap() = Just undefined 

main = print (wrap() :: Maybe Int) 

¿Alguien puede aclarar las razones del comportamiento del typechecker?

+1

Supongo que no existe una conexión entre el tipo 'v' y el tipo de correlación de tipos asociados. – ivanm

+2

Posiblemente relacionado: [ConstraintKinds y las restricciones vacías asociadas predeterminadas] (http://comments.gmane.org/gmane.comp.lang.haskell.glasgow.user/21058) – hammar

Respuesta

4

Se trata de un error con los valores predeterminados tipo asociado en 7,4 .1. Hace unas semanas, me dijeron en #haskell que se trataba de un error conocido que se había corregido, pero no puedo encontrarlo en el tracto GHC.

4
No

realmente una respuesta, pero esto no se trata de ConstraintKinds

class Expression a where 
    type Type a v 
    type Type a v =() 
    wrap :: (Type a v) ~() => a -> Maybe v 

instance Expression() where 
    wrap() = Just undefined 

main = print (wrap() :: Maybe Int) 

no se compila es, pero

class Expression a where 
    type Type a v 
    type Type a v = v 
    wrap :: (Type a v) ~ v => a -> Maybe v 

instance Expression() where 
    wrap() = Just undefined 

main = print (wrap() :: Maybe Int) 

hace

Cuestiones relacionadas