algebraic-classes 0.4 → 0.5
raw patch · 4 files changed
+14/−6 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- Data/Algebra.hs +1/−0
- Data/Algebra/Internal.hs +3/−0
- Data/Algebra/TH.hs +9/−5
- algebraic-classes.cabal +1/−1
Data/Algebra.hs view
@@ -23,6 +23,7 @@ -- * Classes , Algebra(..) , algebraA+ , Signature(..) , AlgebraSignature(..) ) where
Data/Algebra/Internal.hs view
@@ -25,6 +25,9 @@ import Data.Monoid import Control.Arrow ((&&&)) +-- | The signature datatype for the class @c@.+type family Signature (c :: * -> Constraint) :: * -> *+ class Traversable f => AlgebraSignature f where -- | The class for which @f@ is the signature. type Class f :: * -> Constraint
Data/Algebra/TH.hs view
@@ -29,6 +29,7 @@ import Data.Foldable (Foldable(foldMap)) import Data.Traversable (Traversable, forM) import Data.Monoid (Endo(..))+import Data.Maybe (catMaybes) import Language.Haskell.TH import Data.Generics (Data, everywhere, mkT)@@ -55,10 +56,12 @@ let sigName = changeName (++ "Signature") name ops <- forM decs $ \(SigD nm (ForallT [PlainTV tv'] _ tp)) -> do ClassOpI _ _ _ fty <- reify nm- Just (ar, mkCon) <- return $ buildOperation tv' tp- let opName = changeName ("Op_" ++) nm- return $ OperationTH nm opName ar (everywhere (mkT (rename tv' tv)) (mkCon opName)) fty- return $ SignatureTH sigName tv ops+ return $ case buildOperation tv' tp of+ Just (ar, mkCon) -> + let opName = changeName ("Op_" ++) nm+ in Just $ OperationTH nm opName ar (everywhere (mkT (rename tv' tv)) (mkCon opName)) fty+ _ -> Nothing+ return $ SignatureTH sigName tv $ catMaybes ops -- | Derive a signature for an algebraic class. -- For example:@@ -146,9 +149,10 @@ [''Functor, ''Foldable, ''Traversable, ''Eq, ''Ord]] signatureInstances :: Name -> SignatureTH -> [Dec]-signatureInstances nm s = [asInst, showInst]+signatureInstances nm s = [asInst, showInst, sigTFInst] where signature = ConT (signatureName s)+ sigTFInst = TySynInstD ''Signature [ConT nm] signature typeInst = TySynInstD ''Class [signature] (ConT nm) asClauses = [ Clause [ConP opName (map VarP args)] (NormalB (foldl (\e arg -> AppE e (VarE arg)) (VarE fName) args)) []
algebraic-classes.cabal view
@@ -1,5 +1,5 @@ name: algebraic-classes-version: 0.4+version: 0.5 synopsis: Conversions between algebraic classes and F-algebras. description: Algebraic classes are type classes where all the methods return a value of the same type, which is also the class parameter. Examples from @base@ are @Num@ and @Monoid@.