catamorphism 0.6.1.0 → 0.6.1.1
raw patch · 2 files changed
+46/−7 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- catamorphism.cabal +44/−3
- src/Data/Morphism/Cata.hs +2/−4
catamorphism.cabal view
@@ -1,7 +1,48 @@ name: catamorphism-version: 0.6.1.0-synopsis: A package exposing a helper function for generating catamorphisms.-description: A package exposing a helper function for generating catamorphisms.+version: 0.6.1.1+synopsis: Exposes a Template Haskell function for generating catamorphisms.+description:+ This module exposes a 'makeCata' function which can create catamorphisms for+ arbitrary Haskell types. Catamorphisms are functions which deconstruct some+ value by replacing each data constructor with a custom function yielding a+ new value. See <http://www.haskell.org/haskellwiki/Catamorphisms> for a more+ in-depth discussion of catamorphisms in Haskell.+ .+ The Haskell base package already comes with a couple of standard+ catamorphisms, such as 'maybe' (for 'Maybe' values). The 'maybe' function+ could have been generated using 'makeCata' as follows:+ .+ > -- Defines 'maybe :: b -> (a -> b) -> Maybe a -> b'+ > $(makeCata defaultOptions ''Maybe)+ .+ However, catamorphisms are especially useful for recursive data structures.+ Consider the following simple example which defines a basic data type for+ modelling sums of numbers, supporting variables:+ .+ > import Data.Morphism.Cata+ > import Data.Maybe (fromJust)+ >+ > data Expr a = Number a+ > | Variable Char+ > | Sum (Expr a) (Expr a)+ >+ > -- Defines 'expr :: (a -> b) -> (Char -> b) -> (b -> b -> b) -> Expr a -> b'+ > $(makeCata defaultOptions ''Expr)+ .+ The 'makeCata' invocation defines a 'expr' function which works like a fold on+ 'Expr' values; it can be used to implement various useful other functions:+ .+ > -- Evaluate an Expr, given some variable bindings+ > eval :: Num a => [(Char, a)] -> Expr a -> a+ > eval vars = expr id (fromJust . (`lookup` vars)) (+)+ >+ > -- Pretty-prints an Expr+ > pprint :: Show a => Expr a -> String+ > pprint = expr show show (\a b -> a ++ " + " ++ b)+ >+ > -- Counts the number of variables used in an expr+ > numVars :: Expr a -> Int+ > numVars = expr (const 1) (const 0) (+) homepage: https://github.com/frerich/catamorphism license: BSD3 license-file: LICENSE
src/Data/Morphism/Cata.hs view
@@ -177,7 +177,7 @@ return (SigD funName (ForallT (PlainTV resultTypeName : tyVarBndrs) [] (foldr1 makeFuncT args))) funDef :: [Con] -> Q Dec- funDef cons = (FunD funName . (:[])) <$> funImpl cons+ funDef cons = FunD funName . (:[]) <$> funImpl cons funName :: Name funName = mkName $@@ -209,9 +209,7 @@ where conToConP :: Con -> Q Pat- conToConP c = do- argNames <- replicateM (length . conArgTypes $ c) (VarP <$> newName "a")- return (ConP (conName c) argNames)+ conToConP c = ConP (conName c) <$> replicateM (length . conArgTypes $ c) (VarP <$> newName "a") tyVarName :: TyVarBndr -> Name tyVarName (PlainTV n) = n