-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Write functions in tacit (pointless) style using Applicative and De Bruijn index notation. -- -- Write functions in tacit (pointless) style using Applicative and De -- Bruijn index notation. @package data-function-tacit @version 0.1.0.0 -- | Write functions in tacit (pointless) style using Applicative and De -- Bruijn index notation. -- -- Examples: -- -- -- -- This module is intended to be used with Applicative but does -- not export it. -- -- Opposite to De Bruijn indices, this module orders the arguments from -- the outside-in, rather than the inside-out (or left-to-right instead -- of right-to-left). For example, the conventional λλλ3 1 (2 1) -- is instead λλλ1 3 (2 3). -- -- The first argument is z, the second argument z.s, -- the third argument z.s.s, and so on. For the first few -- arguments convenient names have been defined, such as _1, -- _2, _3, and so on. -- -- To export a function use lurryA. You must specify the arity of -- the function, which is intended to be done with TypeApplications (new -- in GHC 8.0). lurryA @(S Z) f says the arity of f is -- one, lurryA @(S (S Z)) f says the arity is two, and so on. -- For convenience the first few Peano numbers have been given aliases, -- such as N1, N2, N3, and so on. -- -- You can write all functions with <*> and -- <$> from Applicative — should be able to, yet -- unproven. -- -- There is a type inference problem with functions where the highest -- index does not match the function arity, such as const. To -- resolve this ambiguity you must give an explicit signature. For -- example: lurryA @N2 (_1 :: (a, (b, c)) -> a). -- -- TODO: -- -- -- -- NOTES: -- -- module Data.Function.Tacit -- | "Curry" a function type with a tuple-list argument. -- -- Example: -- --
--   Lurried ((a, (b, (c, ()))) -> d) ~ a -> b -> c -> d
--   
-- | "Curry" a function with a tuple-list argument. -- -- This type class should be treated as closed. The instances provided -- map exactly to the type-level recursion defined by Lurried. -- -- Use lurryA instead of lurry, which helps resolve -- ambiguity. class Lurry f lurry :: Lurry f => f -> Lurried f -- | Next argument. s :: (a, b) -> b -- | First argument. z :: (a, b) -> a -- | First argument. _1 :: (a, b) -> a -- | Second argument. _2 :: (a, (b, c)) -> b -- | Third argument. _3 :: (a, (b, (c, d))) -> c -- | Fourth argument. _4 :: (a, (b, (c, (e, f)))) -> e -- | Fifth argument. _5 :: (a, (b, (c, (e, (f, g))))) -> f -- | Sixth argument. _6 :: (a, (b, (c, (e, (f, (g, h)))))) -> g -- | Seventh argument. _7 :: (a, (b, (c, (e, (f, (g, (h, i))))))) -> h -- | Eighth argument. _8 :: (a, (b, (c, (e, (f, (g, (h, (i, j)))))))) -> i -- | Ninth argument. _9 :: (a, (b, (c, (e, (f, (g, (h, (i, (j, k))))))))) -> j -- | Peano numbers. data Nat [Z] :: Nat [S] :: Nat -> Nat -- | The Peano number 0. type N0 = Z -- | The Peano number 1. type N1 = S N0 -- | The Peano number 2. type N2 = S N1 -- | The Peano number 3. type N3 = S N2 -- | The Peano number 4. type N4 = S N3 -- | The Peano number 5. type N5 = S N4 -- | The Peano number 6. type N6 = S N5 -- | The Peano number 7. type N7 = S N6 -- | The Peano number 8. type N8 = S N7 -- | The Peano number 9. type N9 = S N8 -- | Cap a tuple-list to the given length. -- -- Example: -- --
--   Take N2 (a, (b, (c, d))) ~ (a, (b, ()))
--   
-- | Lurry a function of given arity. This arity must match exactly to the -- highest index used to avoid ambiguity (see the module docs). -- Otherwise, an explicit signature for the function must be given. -- -- Example: -- --
--   lurryA @N2 (_1 <*> _2) = ($)
--   
lurryA :: (Take n p ~ p', p ~ p', Lurry (p -> r)) => (p -> r) -> Lurried (p' -> r) -- | Increments the argument indices of a function. -- -- Example: -- --
--   shift (_1 <*> _2) = _2 <*> _3
--   
shift :: ((b, c) -> d) -> (a, (b, c)) -> d instance Data.Function.Tacit.Lurry ((a, ()) -> r) instance Data.Function.Tacit.Lurry ((b, cs) -> r) => Data.Function.Tacit.Lurry ((a, (b, cs)) -> r)