2012-08-14 14 views
7

W źródło transformatora państwa w MTL, stwierdzaCo to jest "warunek zasięgu"?

-- --------------------------------------------------------------------------- 
-- 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

Co to jest "warunek pokrycia"? Wszystko, co mogę powiedzieć, to to, że ma coś wspólnego z MTPC i fundepsem.

+0

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

Odpowiedz

14

Sekcja 7.6.3.2 podręcznika GHC [1] mówi nam, że stan zasięg jest:

Stan pokrycia. Dla każdej zależności funkcjonalnej, tvsleft -> tvsright klasy, każda zmienna typu w S(tvsright) musi występować w S(tvsleft), gdzie S jest odwzorowaniem podstawienia każdej zmiennej typu w deklaracji klasy na odpowiedni typ w deklaracji instancji.

w prostym języku angielskim oznacza to, że jeśli masz klasę typ z fundeps, na przykład:

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

można zdefiniować następujących przypadkach:

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 

ale nie następujące przypadki:

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

Jest zdefiniowany w this paper przez Simona Peytona-Jonesa. Definicja 7 definiuje Coverage Condition. Chciałbym zacytować dokładną definicję, ale niestety, nie wiem, jak odtworzyć symbole matematyczne tutaj.