algebraic-classes 0.6 → 0.7
raw patch · 4 files changed
+22/−19 lines, 4 filesdep ~basedep ~sybdep ~template-haskellPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, syb, template-haskell
API changes (from Hackage documentation)
- Data.Algebra.Internal: instance (GHC.Base.Monoid m, Data.Algebra.Internal.Class f b) => Data.Algebra.Internal.Algebra f (Control.Applicative.Const m b)
+ Data.Algebra: type family Class f :: * -> Constraint;
+ Data.Algebra: }
+ Data.Algebra.Internal: instance (GHC.Base.Monoid m, Data.Algebra.Internal.Class f b) => Data.Algebra.Internal.Algebra f (Data.Functor.Const.Const m b)
+ Data.Algebra.Internal: type family Class f :: * -> Constraint;
+ Data.Algebra.Internal: }
- Data.Algebra: class Traversable f => AlgebraSignature f where type family Class f :: * -> Constraint
+ Data.Algebra: class Traversable f => AlgebraSignature f where type Class f :: * -> Constraint where {
- Data.Algebra.Internal: class Traversable f => AlgebraSignature f where type family Class f :: * -> Constraint
+ Data.Algebra.Internal: class Traversable f => AlgebraSignature f where type Class f :: * -> Constraint where {
Files
- CHANGELOG +6/−0
- Data/Algebra/TH.hs +11/−10
- algebraic-classes.cabal +5/−5
- examples/Fractional.hs +0/−4
CHANGELOG view
@@ -1,3 +1,9 @@+0.6 -> 0.7+- Update for GHC 7.10+ - Updated to base-4.9.0.0+ - Updated to template-haskell-2.11.0.0+ - Updated to syb-0.6+ 0.5.2 -> 0.6 - Update for GHC 7.10 - Updated to base-4.8.0.0
Data/Algebra/TH.hs view
@@ -28,7 +28,7 @@ import Control.Arrow ((***)) import Data.Monoid (Endo(..)) -import Data.Maybe (catMaybes)+import Data.Maybe (catMaybes, fromMaybe) import Data.Char (isAlpha) import Language.Haskell.TH import Data.Generics (Data, everywhere, mkT)@@ -58,8 +58,9 @@ (SigD nm (ForallT [tv'] _ tp)) -> do let tvn' = tvName tv' dec <- reify nm+ fty <- fromMaybe defaultFixity <$> reifyFixity nm case dec of- ClassOpI _ _ _ fty ->+ ClassOpI _ _ _ -> return $ case buildOperation tvn' tp of Just (ar, mkCon) -> let opName = changeName addPrefix nm@@ -155,13 +156,13 @@ (FunD fName [Clause (map VarP args) (NormalB (AppE (VarE 'algebra) (foldl (\e arg -> AppE e (VarE arg)) (ConE opName) args))) []]) snd mgiven | OperationTH fName opName ar _ _ <- operations s, let mgiven = lookup (nameBase fName) givenLU, let args = mkArgList ar ]- (++ [InstanceD ctx (AppT (ConT className) typeName) impl]) <$>+ (++ [InstanceD Nothing ctx (AppT (ConT className) typeName) impl]) <$> if addSignature then deriveSignature className else return [] buildSignatureDataType :: SignatureTH -> [Dec] buildSignatureDataType s =- [DataD [] (signatureName s) [PlainTV (typeVarName s)] (constructor <$> operations s)- [''Functor, ''Foldable, ''Traversable, ''Eq, ''Ord]]+ [DataD [] (signatureName s) [PlainTV (typeVarName s)] Nothing (constructor <$> operations s)+ (map ConT [''Functor, ''Foldable, ''Traversable, ''Eq, ''Ord])] signatureInstances :: Name -> SignatureTH -> [Dec] signatureInstances nm s = [asInst, showInst, sigTFInst]@@ -172,7 +173,7 @@ asClauses = [ Clause [ConP opName (map VarP args)] (NormalB (foldl (\e arg -> AppE e (VarE arg)) (VarE fName) args)) [] | OperationTH fName opName ar _ _ <- operations s, let args = mkArgList ar ]- asInst = InstanceD [] (AppT (ConT ''AlgebraSignature) signature) [typeInst, FunD 'evaluate asClauses]+ asInst = InstanceD Nothing [] (AppT (ConT ''AlgebraSignature) signature) [typeInst, FunD 'evaluate asClauses] showsPrecClauses = [ Clause [VarP d, ConP opName (map VarP args)] (NormalB $ createShowsPrec d (nameBase fName) prec args) [] | OperationTH fName opName ar _ (Fixity prec _) <- operations s, let args = mkArgList ar, let d = mkName "d" ]@@ -190,12 +191,12 @@ addArg expr arg = Just $ InfixE expr (VarE '(.)) (Just (InfixE (Just (AppE (VarE 'showChar) (LitE (CharL ' ')))) (VarE '(.)) (Just (AppE (AppE (VarE 'showsPrec) (LitE (IntegerL 11))) (VarE arg)))))- showInst = InstanceD [AppT (ConT ''Show) a] (AppT (ConT ''Show) (AppT signature a)) [FunD 'showsPrec showsPrecClauses]+ showInst = InstanceD Nothing [AppT (ConT ''Show) a] (AppT (ConT ''Show) (AppT signature a)) [FunD 'showsPrec showsPrecClauses] a = VarT $ mkName "a" buildOperation :: Name -> Type -> Maybe (Int, Name -> Con) buildOperation nm (VarT nm') = if nm == nm' then Just (0, \opName -> NormalC opName []) else Nothing-buildOperation nm (AppT (AppT ArrowT h) t) = ((+1) *** fmap (prependC (NotStrict, h))) <$> buildOperation nm t+buildOperation nm (AppT (AppT ArrowT h) t) = ((+1) *** fmap (prependC h)) <$> buildOperation nm t buildOperation _ _ = Nothing changeName :: (String -> String) -> Name -> Name@@ -219,8 +220,8 @@ rename a b c | a == c = b rename _ _ t = t -prependC :: (Strict, Type) -> Con -> Con-prependC st (NormalC nm sts) = NormalC nm (st:sts)+prependC :: Type -> Con -> Con+prependC st (NormalC nm sts) = NormalC nm ((Bang NoSourceUnpackedness NoSourceStrictness, st):sts) tvName :: TyVarBndr -> Name tvName (PlainTV nm) = nm
algebraic-classes.cabal view
@@ -1,5 +1,5 @@ name: algebraic-classes-version: 0.6+version: 0.7 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@.@@ -36,10 +36,10 @@ Data.Algebra.Internal build-depends:- base == 4.8.*- , syb == 0.4.*- , template-haskell == 2.10.0.*+ base == 4.9.*+ , syb == 0.6.*+ , template-haskell == 2.11.0.* source-repository head type: git- location: git://github.com/sjoerdvisscher/algebraic-functors.git+ location: git://github.com/sjoerdvisscher/algebraic-classes.git
examples/Fractional.hs view
@@ -2,11 +2,7 @@ {-# LANGUAGE TemplateHaskell, TypeFamilies, DeriveTraversable, RankNTypes #-} import Data.Algebra-import Data.Algebra.TH import Data.Ratio--deriveSignature ''Num-deriveSignature ''Fractional deriveInstance [t| forall m n. (Num m, Num n) => Num (m, n) |] deriveInstance [t| forall m n. (Fractional m, Fractional n) => Fractional (m, n) |]