| Copyright | (c) Galois Inc 2021 |
|---|---|
| Safe Haskell | Safe-Inferred |
| Language | Haskell2010 |
Data.Parameterized.Fin
Description
is a finite type with exactly Fin nn elements. Essentially, they bundle a
NatRepr that has an existentially-quantified type parameter with a proof that
its parameter is less than some fixed natural.
They are useful in combination with types of a fixed size. For example Fin is
used as the index in the FunctorWithIndex instance for
Vector. As another example, a Map ( is a Fin n) aMap
that naturally has a fixed size bound of n.
Synopsis
- data Fin (n :: Natural)
- mkFin :: forall (i :: Natural) (n :: Natural). (i + 1) <= n => NatRepr i -> Fin n
- mkFinModN :: forall (n :: Natural) (i :: Nat). 1 <= n => NatRepr n -> NatRepr i -> Fin n
- buildFin :: forall (m :: Nat). NatRepr m -> (forall (n :: Natural). (n + 1) <= m => NatRepr n -> Fin (n + 1) -> Fin ((n + 1) + 1)) -> Fin (m + 1)
- countFin :: forall (m :: Nat). NatRepr m -> (forall (n :: Natural). (n + 1) <= m => NatRepr n -> Fin (n + 1) -> Bool) -> Fin (m + 1)
- viewFin :: forall (n :: Natural) r. (forall (i :: Natural). (i + 1) <= n => NatRepr i -> r) -> Fin n -> r
- finFromNatModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Natural -> Fin n
- finToNat :: forall (n :: Natural). Fin n -> Natural
- embed :: forall (n :: Natural) (m :: Natural). n <= m => Fin n -> Fin m
- tryEmbed :: forall (n :: Nat) (m :: Nat). NatRepr n -> NatRepr m -> Fin n -> Maybe (Fin m)
- minFin :: forall (n :: Natural). 1 <= n => Fin n
- incFin :: forall (n :: Natural). Fin n -> Fin (n + 1)
- fin0Absurd :: Fin 0 -> a
- addFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Fin n -> Fin n
- subFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Fin n -> Fin n
- mulFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Fin n -> Fin n
- negFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Fin n
- recipFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Maybe (Fin n)
Documentation
data Fin (n :: Natural) Source #
The type has exactly Fin nn inhabitants.
Instances
| (1 <= n, KnownNat n) => Bounded (Fin n) Source # | |
| (1 <= n, KnownNat n) => Num (Fin n) Source # | Arithmetic is performed modulo |
| Show (Fin n) Source # | |
| Eq (Fin n) Source # | |
| Ord (Fin n) Source # | |
| Hashable (Fin n) Source # | |
Defined in Data.Parameterized.Fin | |
| FoldableWithIndex (Fin n) (FinMap n) Source # | |
Defined in Data.Parameterized.FinMap.Safe Methods ifoldMap :: Monoid m => (Fin n -> a -> m) -> FinMap n a -> m # ifoldMap' :: Monoid m => (Fin n -> a -> m) -> FinMap n a -> m # ifoldr :: (Fin n -> a -> b -> b) -> b -> FinMap n a -> b # ifoldl :: (Fin n -> b -> a -> b) -> b -> FinMap n a -> b # | |
| FoldableWithIndex (Fin n) (FinMap n) Source # | |
Defined in Data.Parameterized.FinMap.Unsafe Methods ifoldMap :: Monoid m => (Fin n -> a -> m) -> FinMap n a -> m # ifoldMap' :: Monoid m => (Fin n -> a -> m) -> FinMap n a -> m # ifoldr :: (Fin n -> a -> b -> b) -> b -> FinMap n a -> b # ifoldl :: (Fin n -> b -> a -> b) -> b -> FinMap n a -> b # | |
| FoldableWithIndex (Fin n) (Vector n) Source # | |
Defined in Data.Parameterized.Vector Methods ifoldMap :: Monoid m => (Fin n -> a -> m) -> Vector n a -> m # ifoldMap' :: Monoid m => (Fin n -> a -> m) -> Vector n a -> m # ifoldr :: (Fin n -> a -> b -> b) -> b -> Vector n a -> b # ifoldl :: (Fin n -> b -> a -> b) -> b -> Vector n a -> b # | |
| FunctorWithIndex (Fin n) (FinMap n) Source # | |
| FunctorWithIndex (Fin n) (FinMap n) Source # | |
| FunctorWithIndex (Fin n) (Vector n) Source # | |
| TraversableWithIndex (Fin n) (Vector n) Source # | |
Defined in Data.Parameterized.Vector | |
mkFinModN :: forall (n :: Natural) (i :: Nat). 1 <= n => NatRepr n -> NatRepr i -> Fin n Source #
Construct a value from the number Fin ni, where i is reduced
modulo n.
buildFin :: forall (m :: Nat). NatRepr m -> (forall (n :: Natural). (n + 1) <= m => NatRepr n -> Fin (n + 1) -> Fin ((n + 1) + 1)) -> Fin (m + 1) Source #
countFin :: forall (m :: Nat). NatRepr m -> (forall (n :: Natural). (n + 1) <= m => NatRepr n -> Fin (n + 1) -> Bool) -> Fin (m + 1) Source #
Count all of the numbers up to m that meet some condition.
viewFin :: forall (n :: Natural) r. (forall (i :: Natural). (i + 1) <= n => NatRepr i -> r) -> Fin n -> r Source #
fin0Absurd :: Fin 0 -> a Source #
It is not possible to construct an element of .Fin 0
addFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Fin n -> Fin n Source #
Add two values and reduce the result modulo Fin nn.
subFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Fin n -> Fin n Source #
Subtract two values and reduce the result modulo Fin nn.
mulFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Fin n -> Fin n Source #
Multiply two values and reduce the result modulo Fin nn.
recipFinModN :: forall (n :: Natural). 1 <= n => NatRepr n -> Fin n -> Maybe (Fin n) Source #
Given a value i :: , compute the reciprocal (i.e., the modular
inverse) if one exists. That is, attempt to compute Fin ni^-1 such that
i * i^-1 equals 1 modulo n. Note that a reciprocal will only exist if
i and n are relatively prime, i.e., if gcd i n == 1. If they are not
relatively prime, then this function will return Nothing.
Note that in the degenerate case where n == 1, this function will always
return Just 0. The value 0 is the only element of , and Fin 10 is
its own reciprocal.