| Safe Haskell | None |
|---|---|
| Language | GHC2024 |
Language.Haskell.Syntax.Decls.Overlap
Description
Data-type describing the overlap annotations for instances.
Synopsis
- data OverlapMode pass
- = NoOverlap (XOverlapMode pass)
- | Overlappable (XOverlapMode pass)
- | Overlapping (XOverlapMode pass)
- | Overlaps (XOverlapMode pass)
- | Incoherent (XOverlapMode pass)
- | NonCanonical (XOverlapMode pass)
- | XOverlapMode !(XXOverlapMode pass)
- hasIncoherentFlag :: OverlapMode p -> Bool
- hasOverlappableFlag :: OverlapMode p -> Bool
- hasOverlappingFlag :: OverlapMode p -> Bool
- hasNonCanonicalFlag :: OverlapMode p -> Bool
Documentation
data OverlapMode pass Source #
The status of overlapping instances (including no overlap) for a type.
Constructors
| NoOverlap (XOverlapMode pass) | This instance must not overlap another |
| Overlappable (XOverlapMode pass) | Silently ignore this instance if you find a more specific one that matches the constraint you are trying to resolve Example: constraint (Foo [Int]) instance Foo [Int] instance {-# OVERLAPPABLE #-} Foo [a] Since the second instance has the Overlappable flag, the first instance will be chosen (otherwise its ambiguous which to choose) |
| Overlapping (XOverlapMode pass) | Silently ignore any more general instances that may be used to solve the constraint. Example: constraint (Foo [Int]) instance {-# OVERLAPPING #-} Foo [Int] instance Foo [a] Since the first instance has the Overlapping flag, the second---more general---instance will be ignored (otherwise it is ambiguous which to choose) |
| Overlaps (XOverlapMode pass) | Equivalent to having both |
| Incoherent (XOverlapMode pass) | Behave like Overlappable and Overlapping, and in addition pick an arbitrary one if there are multiple matching candidates, and don't worry about later instantiation Example: constraint (Foo [b])
instance {-# INCOHERENT -} Foo [Int]
instance Foo [a]
Without the Incoherent flag, we'd complain that
instantiating |
| NonCanonical (XOverlapMode pass) | Behave like Incoherent, but the instance choice is observable by the program behaviour. See Note [Coherence and specialisation: overview]. We don't have surface syntax for the distinction between
Incoherent and NonCanonical instances; instead, the flag
`-f{no-}specialise-incoherents` (on by default) controls
whether |
| XOverlapMode !(XXOverlapMode pass) | The Trees That Grow extension point constructor. |
Instances
hasIncoherentFlag :: OverlapMode p -> Bool Source #
hasOverlappableFlag :: OverlapMode p -> Bool Source #
hasOverlappingFlag :: OverlapMode p -> Bool Source #
hasNonCanonicalFlag :: OverlapMode p -> Bool Source #