Class Enum defines operations on sequentially ordered types.
The enumFrom... methods are used in Haskell's translation of
arithmetic sequences.
Instances of Enum may be derived for any enumeration type (types
whose constructors have no fields). The nullary constructors are
assumed to be numbered left-to-right by fromEnum from 0 through n-1.
See Chapter 10 of the Haskell Report for more details.
For any type that is an instance of class Bounded as well as Enum, the following should hold:
The calls
succ maxBoundandpred minBoundshould result in a runtime error.fromEnum and toEnum should give a runtime error if the result value is not representable in the result type. For example,
toEnum 7 :: Boolis an error.enumFrom and enumFromThen should be defined with an implicit bound, thus:
enumFrom x = enumFromTo x maxBound
enumFromThen x y = enumFromThenTo x y bound
where
bound | fromEnum y >= fromEnum x = maxBound
| otherwise = minBoundMethods
succ :: a -> aSuccessor of a value. For numeric types, succ adds 1.
pred :: a -> aPredecessor of a value. For numeric types, pred subtracts 1.
toEnum :: Int -> aConvert from an Int.
fromEnum :: a -> IntenumFrom :: a -> [a]Used in Haskell's translation of
[n..]with[n..] = enumFrom n, a possible implementation beingenumFrom n = n : enumFrom (succ n).Examples
enumFrom 4 :: [Integer] = [4,5,6,7,...]enumFrom 6 :: [Int] = [6,7,8,9,...,maxBound :: Int]
enumFromThen :: a -> a -> [a]Used in Haskell's translation of
[n,n'..]with[n,n'..] = enumFromThen n n', a possible implementation beingenumFromThen n n' = n : n' : worker (f x) (f x n'),worker s v = v : worker s (s v),x = fromEnum n' - fromEnum nandf n y | n > 0 = f (n - 1) (succ y) | n < 0 = f (n + 1) (pred y) | otherwise = yExamples
enumFromThen 4 6 :: [Integer] = [4,6,8,10...]enumFromThen 6 2 :: [Int] = [6,2,-2,-6,...,minBound :: Int]
enumFromTo :: a -> a -> [a]Used in Haskell's translation of
[n..m]with[n..m] = enumFromTo n m, a possible implementation beingenumFromTo n m | n <= m = n : enumFromTo (succ n) m | otherwise = []Examples
enumFromTo 6 10 :: [Int] = [6,7,8,9,10]enumFromTo 42 1 :: [Integer] = []
enumFromThenTo :: a -> a -> a -> [a]Used in Haskell's translation of
[n,n'..m]with[n,n'..m] = enumFromThenTo n n' m, a possible implementation beingenumFromThenTo n n' m = worker (f x) (c x) n m,x = fromEnum n' - fromEnum n,c x = bool (>=) ((x 0)f n y | n > 0 = f (n - 1) (succ y) | n < 0 = f (n + 1) (pred y) | otherwise = yand
worker s c v m | c v m = v : worker s c (s v) m | otherwise = []Examples
enumFromThenTo 4 2 -6 :: [Integer] = [4,2,0,-2,-4,-6]enumFromThenTo 6 8 2 :: [Int] = []
Instances122Enum, …
Enum IntegerDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum NaturalDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum ExtensionDefined in ghc-boot-th-9.10.3 · GHC.LanguageExtensions.TypeEnum ByteOrderDefined in ghc-internal-9.1003.0 · GHC.Internal.ByteOrderEnum ClosureTypeDefined in ghc-internal-9.1003.0 · GHC.Internal.ClosureTypesEnum CBoolDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CCharDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CClockDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CDoubleDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CFloatDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CIntDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CIntMaxDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CIntPtrDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CLLongDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CLongDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CPtrdiffDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CSCharDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CSUSecondsDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CShortDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CSigAtomicDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CSizeDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CTimeDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CUCharDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CUIntDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CUIntMaxDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CUIntPtrDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CULLongDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CULongDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CUSecondsDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CUShortDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum CWcharDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.C.TypesEnum IntPtrDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.PtrEnum WordPtrDefined in ghc-internal-9.1003.0 · GHC.Internal.Foreign.PtrEnum AssociativityDefined in ghc-internal-9.1003.0 · GHC.Internal.GenericsEnum DecidedStrictnessDefined in ghc-internal-9.1003.0 · GHC.Internal.GenericsEnum SourceStrictnessDefined in ghc-internal-9.1003.0 · GHC.Internal.GenericsEnum SourceUnpackednessDefined in ghc-internal-9.1003.0 · GHC.Internal.GenericsEnum SeekModeDefined in ghc-internal-9.1003.0 · GHC.Internal.IO.DeviceEnum IOModeDefined in ghc-internal-9.1003.0 · GHC.Internal.IO.IOModeEnum Int16Defined in ghc-internal-9.1003.0 · GHC.Internal.IntEnum Int32Defined in ghc-internal-9.1003.0 · GHC.Internal.IntEnum Int64Defined in ghc-internal-9.1003.0 · GHC.Internal.IntEnum Int8Defined in ghc-internal-9.1003.0 · GHC.Internal.IntEnum DoCostCentresDefined in ghc-internal-9.1003.0 · GHC.Internal.RTS.FlagsEnum DoHeapProfileDefined in ghc-internal-9.1003.0 · GHC.Internal.RTS.FlagsEnum DoTraceDefined in ghc-internal-9.1003.0 · GHC.Internal.RTS.FlagsEnum GiveGCStatsDefined in ghc-internal-9.1003.0 · GHC.Internal.RTS.FlagsEnum IoSubSystemDefined in ghc-internal-9.1003.0 · GHC.Internal.RTS.FlagsEnum CBlkCntDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CBlkSizeDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CCcDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CClockIdDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CDevDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CFsBlkCntDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CFsFilCntDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CGidDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CIdDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CInoDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CKeyDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CModeDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CNfdsDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CNlinkDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum COffDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CPidDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CRLimDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CSocklenDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CSpeedDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CSsizeDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CTcflagDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum CUidDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum FdDefined in ghc-internal-9.1003.0 · GHC.Internal.System.Posix.TypesEnum GeneralCategoryDefined in ghc-internal-9.1003.0 · GHC.Internal.UnicodeEnum Word16Defined in ghc-internal-9.1003.0 · GHC.Internal.WordEnum Word32Defined in ghc-internal-9.1003.0 · GHC.Internal.WordEnum Word64Defined in ghc-internal-9.1003.0 · GHC.Internal.WordEnum Word8Defined in ghc-internal-9.1003.0 · GHC.Internal.WordEnum BoolDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum CharDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum DoubleDefined in ghc-internal-9.1003.0 · GHC.Internal.Float · orphanfromEnum just truncates its argument, beware of all sorts of overflows.
List generators have extremely peculiar behavior, mandated by Haskell Report 2010:
Example1 expression [0..1.5][0.0,1.0,2.0]
Enum FloatDefined in ghc-internal-9.1003.0 · GHC.Internal.Float · orphanfromEnum just truncates its argument, beware of all sorts of overflows.
List generators have extremely peculiar behavior, mandated by Haskell Report 2010:
Example1 expression [0..1.5 :: Float][0.0,1.0,2.0]
Enum IntDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum LevityDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum OrderingDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum VecCountDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum VecElemDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum WordDefined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum InvariantClassDefined in invariant-0.6.4 · Data.Functor.Invariant.TH.InternalEnum CardinalityDefined in random-1.2.1.3 · System.Random.GFiniteThis is needed only as a superclass of Integral.
Enum I8Defined in text-2.1.3 · Data.Text.ForeignEnum FPFormatDefined in text-2.1.3 · Data.Text.Lazy.Builder.RealFloatEnum DayDefined in time-1.12.2 · Data.Time.Calendar.DaysEnum MonthDefined in time-1.12.2 · Data.Time.Calendar.MonthEnum QuarterDefined in time-1.12.2 · Data.Time.Calendar.QuarterEnum QuarterOfYearDefined in time-1.12.2 · Data.Time.Calendar.Quartermaps Q1..Q4 to 1..4
Enum DayOfWeekDefined in time-1.12.2 · Data.Time.Calendar.WeekEnum DiffTimeDefined in time-1.12.2 · Data.Time.Clock.Internal.DiffTimeEnum NominalDiffTimeDefined in time-1.12.2 · Data.Time.Clock.Internal.NominalDiffTimeEnum ()Defined in ghc-internal-9.1003.0 · GHC.Internal.EnumEnum a => Enum (First a)Defined in base-4.20.2.0 · Data.SemigroupEnum a => Enum (Last a)Defined in base-4.20.2.0 · Data.SemigroupEnum a => Enum (Max a)Defined in base-4.20.2.0 · Data.SemigroupEnum a => Enum (Min a)Defined in base-4.20.2.0 · Data.SemigroupEnum a => Enum (WrappedMonoid a)Defined in base-4.20.2.0 · Data.SemigroupEnum a => Enum (And a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.BitsEnum a => Enum (Iff a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.BitsEnum a => Enum (Ior a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.BitsEnum a => Enum (Xor a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.BitsEnum a => Enum (Identity a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.IdentityEnum a => Enum (a)Defined in ghc-internal-9.1003.0 · GHC.Internal.EnumIntegral a => Enum (Ratio a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Real(Enum a, Bounded a, Eq a) => Enum (Down a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.OrdEnum (Fixed a)Defined in base-4.20.2.0 · Data.FixedRecall that, for numeric types, succ and pred typically add and subtract
1, respectively. This is not true in the case of Fixed, whose successor and predecessor functions intuitively return the "next" and "previous" values in the enumeration. The results of these functions thus depend on the resolution of the Fixed value. For example, when enumerating values of resolution10^-3oftype Milli = Fixed E3,Example1 expression succ (0.000 :: Milli)0.001
and likewise
Example1 expression pred (0.000 :: Milli)-0.001
In other words, succ and pred increment and decrement a fixed-precision value by the least amount such that the value's resolution is unchanged. For example,
10^-12is the smallest (positive) amount that can be added to a value oftype Pico = Fixed E12without changing its resolution, and soExample1 expression succ (0.000000000000 :: Pico)0.000000000001
and similarly
Example1 expression pred (0.000000000000 :: Pico)-0.000000000001
This is worth bearing in mind when defining Fixed arithmetic sequences. In particular, you may be forgiven for thinking the sequence
[1..10] :: [Pico]evaluates to
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] :: [Pico].However, this is not true. On the contrary, similarly to the above implementations of succ and pred,
enumFromTo :: Pico -> Pico -> [Pico]has a "step size" of10^-12. Hence, the list[1..10] :: [Pico]has the form[1.000000000000, 1.00000000001, 1.00000000002, ..., 10.000000000000]and contains
9 * 10^12 + 1values.Enum (Proxy s)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.ProxyEnum (bi a b) => Enum (Biap bi a b)Defined in bifunctors-5.6.2 · Data.Bifunctor.BiapEnum (f a) => Enum (Ap f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.MonoidEnum (f a) => Enum (Alt f a)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Semigroup.InternalEnum a => Enum (Const a b)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Functor.ConstEnum a => Enum (Tagged s a)Defined in tagged-0.8.9 · Data.TaggedCoercible a b => Enum (Coercion a b)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Type.Coerciona ~ b => Enum (a :~: b)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Type.Equalitya ~~ b => Enum (a :~~: b)Defined in ghc-internal-9.1003.0 · GHC.Internal.Data.Type.EqualityEnum (f (g a)) => Enum (Compose f g a)Defined in base-4.20.2.0 · Data.Functor.Compose