Какое условие покрытия?

Источник для трансформатора State в mtl указано:

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

Что такое «условие покрытия»? Все, что я могу сказать, это то, что это как-то связано с MTPC и fundeps.


person Dan Burton    schedule 14.08.2012    source источник
comment
См. haskell.org/ghc. /docs/latest/html/users_guide/   -  person Joey Adams    schedule 15.08.2012


Ответы (2)


Раздел 7.6.3.2 руководства GHC говорит нам, каково условие покрытия:

Условия покрытия. Для каждой функциональной зависимости tvsleft -> tvsright класса каждая переменная типа в S(tvsright) должна появиться в S(tvsleft), где S — это подстановка, отображающая каждую переменную типа в объявлении класса на соответствующий тип в объявлении экземпляра.

На простом английском языке это означает, что если у вас есть класс типов с fundeps, например:

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

вы можете определить следующие экземпляры:

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

но не в следующих случаях:

instance Convert String a        -- a only present on the right
instance Convert a      (a,b)    -- b only present on the right
person opqdonut    schedule 14.08.2012

Он определен в этой статье Саймон Пейтон-Джонс. Определение 7 определяет Coverage Condition. Я бы привел точное определение, но, увы, не знаю, как воспроизвести здесь математические символы.

person Frerich Raabe    schedule 14.08.2012