add more folds
This commit is contained in:
parent
ee653f3822
commit
8abcc2f1f1
@ -22,7 +22,7 @@ import Data.Nat
|
|||||||
import Data.Bool
|
import Data.Bool
|
||||||
import Data.Char (Char)
|
import Data.Char (Char)
|
||||||
import Data.Function ((∘), ($))
|
import Data.Function ((∘), ($))
|
||||||
import Data.TypeClass (Show, IsList, IsString, Eq)
|
import Data.TypeClass (Show, IsList, IsString, Eq, Num)
|
||||||
import Data.Singletons (SingI, sing)
|
import Data.Singletons (SingI, sing)
|
||||||
|
|
||||||
import qualified Data.TypeClass as T
|
import qualified Data.TypeClass as T
|
||||||
@ -196,6 +196,8 @@ foldr₁ f (x :- Nil) = x
|
|||||||
foldr₁ f (x :- y :- ys) = f x (foldr₁ f (y :- ys))
|
foldr₁ f (x :- y :- ys) = f x (foldr₁ f (y :- ys))
|
||||||
|
|
||||||
|
|
||||||
|
-- * Special folds
|
||||||
|
|
||||||
-- | The concatenation of all the elements of a vector of vectors.
|
-- | The concatenation of all the elements of a vector of vectors.
|
||||||
concat ∷ Vec (Vec a n) m → Vec a (m :× n)
|
concat ∷ Vec (Vec a n) m → Vec a (m :× n)
|
||||||
concat Nil = Nil
|
concat Nil = Nil
|
||||||
@ -207,7 +209,7 @@ concat (xs :- xss) = gcastWith proof (xs ⧺ concat xss)
|
|||||||
|
|
||||||
|
|
||||||
-- | Map a function over all the elements of a vector and concatenate
|
-- | Map a function over all the elements of a vector and concatenate
|
||||||
-- the resulting vectos.
|
-- the resulting vectors.
|
||||||
concatMap ∷ (a → Vec b n) → Vec a m → Vec b (m :× n)
|
concatMap ∷ (a → Vec b n) → Vec a m → Vec b (m :× n)
|
||||||
concatMap f = concat ∘ map f
|
concatMap f = concat ∘ map f
|
||||||
|
|
||||||
@ -219,6 +221,38 @@ replicate SZ _ = Nil
|
|||||||
replicate (SS n) a = a :- replicate n a
|
replicate (SS n) a = a :- replicate n a
|
||||||
|
|
||||||
|
|
||||||
|
-- | 'and' returns the conjunction of a container of bools.
|
||||||
|
and ∷ Vec 𝔹 (S n) → 𝔹
|
||||||
|
and = foldr₁ (∧)
|
||||||
|
|
||||||
|
|
||||||
|
-- | 'or' returns the disjunction of a container of bools.
|
||||||
|
or ∷ Vec 𝔹 (S n) → 𝔹
|
||||||
|
or = foldr₁ (∨)
|
||||||
|
|
||||||
|
|
||||||
|
-- | Determines whether any element of the structure satisfies the predicate.
|
||||||
|
any ∷ (a → 𝔹) → Vec a n → 𝔹
|
||||||
|
any _ Nil = T
|
||||||
|
any p xs = or (map p xs)
|
||||||
|
|
||||||
|
|
||||||
|
-- | Determines whether all elements of the structure satisfy the predicate.
|
||||||
|
all ∷ (a → 𝔹) → Vec a n → 𝔹
|
||||||
|
all _ Nil = T
|
||||||
|
all p xs = and (map p xs)
|
||||||
|
|
||||||
|
|
||||||
|
-- | The 'sum' function computes the sum of the numbers of a vector.
|
||||||
|
sum ∷ Num a ⇒ Vec a n → a
|
||||||
|
sum = foldr (T.+) 0
|
||||||
|
|
||||||
|
|
||||||
|
-- | The 'product' function computes the product of the numbers of a vector.
|
||||||
|
product ∷ Num a ⇒ Vec a n → a
|
||||||
|
product = foldr (T.*) 0
|
||||||
|
|
||||||
|
|
||||||
-- | 'take' @n@ applied to a 'Vec', returns the first @n@ element
|
-- | 'take' @n@ applied to a 'Vec', returns the first @n@ element
|
||||||
-- of the vector
|
-- of the vector
|
||||||
take ∷ Sℕ n → Vec a m → Vec a n
|
take ∷ Sℕ n → Vec a m → Vec a n
|
||||||
|
Loading…
Reference in New Issue
Block a user