2012-04-30 5 views
9

Ho riscontrato uno strano problema durante la definizione di un vincolo predefinito. Se un vincolo è un'unità, l'istanza predefinita non viene scelta. In tutti gli altri casi, funziona come previsto.I tipi di vincoli predefiniti vengono ignorati

{-# 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) 

Qualcuno può chiarire le ragioni del comportamento del tipografo?

+1

Indovinato, perché non esiste alcuna connessione tra il tipo 'v' e il mapping del tipo associato a cui si risolve? – ivanm

+2

Possibilmente correlato: [Vincoli e vincoli vuoti associati predefiniti] (http://comments.gmane.org/gmane.comp.lang.haskell.glasgow.user/21058) – hammar

risposta

4

Questo è un bug con le impostazioni predefinite tipo associato a 7.4 .1. Qualche settimana fa mi è stato detto su #haskell che si tratta di un bug noto che è stato corretto, ma non riesco a trovarlo sul tracciato di GHC.

4
Non

davvero una risposta, ma questo non si tratta di 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) 

non compila è, ma

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) 

fa