HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Moduledeferred-folds-0.9.18.6Haskell2010

DeferredFolds.Unfoldr

  • 1 type
  • 45 values
newtypenewtype Unfoldr a
#

A projection on data, which only knows how to execute a right-fold.

It is a monad and a monoid, and is very useful for efficiently aggregating the projections on data intended for right-folding, since its concatenation (<>) has complexity of O(1).

Intuition

The intuition of what this abstraction is all about can be derived from lists.

Let's consider the Data.List.foldr function for lists:

foldr :: (a -> b -> b) -> b -> [a] -> b

If we rearrange its parameters we get

foldr :: [a] -> (a -> b -> b) -> b -> b

Which in Haskell is essentially the same as

foldr :: [a] -> (forall b. (a -> b -> b) -> b -> b)

We can isolate that part into an abstraction:

newtype Unfoldr a = Unfoldr (forall b. (a -> b -> b) -> b -> b)

Then we get to this simple morphism:

list :: [a] -> Unfoldr a
list list = Unfoldr (\ step init -> foldr step init list)

We can do the same with say Data.Text.Text:

text :: Text -> Unfoldr Char
text text = Unfoldr (\ step init -> Data.Text.foldr step init text)

And then we can use those both to concatenate with just an O(1) cost:

abcdef :: Unfoldr Char
abcdef = list ['a', 'b', 'c'] <> text "def"

Please notice that up until this moment no actual data materialization has happened and hence no traversals have appeared. All that we've done is just composed a function, which only specifies which parts of data structures to traverse to perform a right-fold. Only at the moment where the actual folding will happen will we actually traverse the source data. E.g., using the "fold" function:

abcdefLength :: Int
abcdefLength = fold Control.Foldl.length abcdef

Constructors

  • Unfoldr (forall x. (a -> x -> x) -> x -> x)
Instances13Monad, Functor, Applicative, Foldable, Traversable, Alternative, …
  • Monad UnfoldrDefined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Functor UnfoldrDefined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Applicative UnfoldrDefined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Foldable UnfoldrDefined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Traversable UnfoldrDefined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Alternative UnfoldrDefined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • MonadPlus UnfoldrDefined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • IsList (Unfoldr a)Defined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Eq a => Eq (Unfoldr a)Defined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Show a => Show (Unfoldr a)Defined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Semigroup (Unfoldr a)Defined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • Monoid (Unfoldr a)Defined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
  • type Item (Unfoldr a) = aDefined in deferred-folds-0.9.18.6 · DeferredFolds.Defs.Unfoldr · orphan
valuefold :: Fold input output -> Unfoldr input -> output
#

Apply a Gonzalez fold

valuereverse :: Unfoldr a -> Unfoldr a
#

Reverse the order.

Use with care, because it requires to allocate all elements.

valueenumsFrom :: Enum a => a -> Unfoldr a
#

Ascending infinite stream of enums starting from the one specified

valuereverseDigits
  1. :: Integral a
  2. => a

    Radix

  3. -> a

    Number

  4. -> Unfoldr a
#

Digits of a non-negative number in numeral system based on the specified radix. The digits come in reverse order.

E.g., here's how an unfold of binary digits in proper order looks:

binaryDigits :: Integral a => a -> Unfoldr a
binaryDigits = reverse . reverseDigits 2
valuetextWords :: Text -> Unfoldr Text
#

Reproduces the behaviour of words.

Implementation is efficient and avoids allocation of an intermediate list.

Transformer of chars, replaces all space-like chars with space, all newline-like chars with \n, and trims their duplicate sequences to single-char. Oh yeah, it also trims whitespace from beginning and end.