2012-08-14 19 views
7

Nel fonte per il trasformatore Stato nel mtl, essa affermaQual è la "condizione di copertura"?

-- --------------------------------------------------------------------------- 
-- Instances for other mtl transformers 
-- 
-- All of these instances need UndecidableInstances, 
-- because they do not satisfy the coverage condition. 

http://hackage.haskell.org/packages/archive/mtl/2.1.2/doc/html/src/Control-Monad-State-Class.html

Qual è la "condizione di copertura"? Tutto quello che posso dire è che ha qualcosa a che fare con MTPC e fondi.

+0

Vedere http://www.haskell.org/ghc/docs/latest/html/users_guide/type-class-extensions.html#instance-rules –

risposta

14

sezione 7.6.3.2 del manuale GHC [1] ci dice che la condizione di copertura è:

La condizione di copertura. Per ogni dipendenza funzionale, tvsleft -> tvsright, della classe, ogni variabile di tipo in S(tvsright) deve essere visualizzata in S(tvsleft), dove S è la sostituzione che associa ogni variabile di tipo nella dichiarazione di classe al tipo corrispondente nella dichiarazione di istanza.

In parole povere questo significa che se si dispone di una classe tipo con fundeps, ad esempio:

class Convert a b | a -> b where 
    convert :: a -> b 

è possibile definire i seguenti casi:

instance Convert String String -- no type variables 
instance Convert [a] [a]  -- type var a present on both sides 
instance Convert (a,b) a  -- a on the right => a on the left 

ma non il seguenti istanze:

instance Convert String a  -- a only present on the right 
instance Convert a  (a,b) -- b only present on the right 
2

È definito in this paper da Simon Peyton-Jones. La definizione 7 definisce Coverage Condition. Citerò la definizione esatta ma ahimè, non so come riprodurre qui i simboli matematici.