The source for the State
transformer in mtl states:
-- ---------------------------------------------------------------------------
-- Instances for other mtl transformers
--
-- All of these instances need UndecidableInstances,
-- because they do not satisfy the coverage condition.
What is the "coverage condition"? All I can tell is that it has something to do with MTPCs and fundeps.
Definition(s): The percentage of conditions within decision expressions that have been evaluated to both true and false.
The percentage of all condition outcomes and decision outcomes that have been exercised by a test suite. 100% decision condition coverage implies both 100% condition coverage and 100% decision coverage.
With Condition/Decision coverage the possible outcomes of each condition and of the decision are tested at least once. This implies both Condition coverage and Decision coverage. In other words we cover that all conditions are one time TRUE and one time FALSE and we cover one time the THEN and one time the ELSE.
Multiple condition coverage: A multiple (or compound) condition is one of all the available cases for the || and && logical operator compositions, whenever it appears in a C function.
Section 7.6.3.2 of the GHC manual tells us what the coverage condition is:
The Coverage Condition. For each functional dependency,
tvsleft -> tvsright
, of the class, every type variable inS(tvsright)
must appear inS(tvsleft)
, whereS
is the substitution mapping each type variable in the class declaration to the corresponding type in the instance declaration.
In plain English, this means that if you have a type class with fundeps, for example:
class Convert a b | a -> b where
convert :: a -> b
you can define the following instances:
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
but not the following instances:
instance Convert String a -- a only present on the right
instance Convert a (a,b) -- b only present on the right
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With