-- | This package provides a framework for constructing variadic -- functions as folds over function applications. -- -- For example, a variadic function @f@ may be reduced like this: -- -- @ -- f a b c -- ≡ foldlApp @(~) f' z a b c -- ≡ f' (f' (f' z a) b) c -- @ -- -- Both left and right associative folds are available. -- -- This module re-exports "Data.FoldApp.Identity" which assumes the -- identity conversion for arguments. "Data.FoldApp.Generic" provides -- the generalised folds where a different converter may be given. -- Conversion allows for folding over differently-typed arguments by -- converting them to a common type. -- -- "Data.FoldApp.Function" contains several variadic functions which -- may be useful as examples or in your programs. -- -- Folds cannot be defined to return functions. This is because the -- parameters intended for the returned function become confused with -- the parameters intended for folding. This weakness can be -- circumvented by wrapping and unwrapping returned functions with -- a newtype at the cost of inconvenience. -- -- If a type inference problem arises, you possibly need to provide -- an annotation for some arguments or an annotation for the return -- type. For example, without any other typing context the following -- is ambiguous … -- -- @ -- listOf "hello" "sailor!" -- @ -- -- … because it is not known how many more arguments should be -- accepted. An annotation such as the following fixes this problem … -- -- @ -- listOf "hello" "sailor!" :: String -> [String] -- @ -- -- … saying one more @String@ argument must be given and a @[String]@ -- will be returned. -- module Data.FoldApp ( module Data.FoldApp.Function , module Data.FoldApp.Identity ) where import Data.FoldApp.Function import Data.FoldApp.Identity