compdata 0.12 → 0.12.1
raw patch · 8 files changed
+183/−57 lines, 8 filesdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base
API changes (from Hackage documentation)
- Data.Comp.Arbitrary: instance Data.Comp.Derive.Arbitrary.ArbitraryF GHC.Base.Maybe
- Data.Comp.DeepSeq: instance Data.Comp.Derive.DeepSeq.NFDataF GHC.Base.Maybe
- Data.Comp.Equality: instance Data.Comp.Derive.Equality.EqF GHC.Base.Maybe
- Data.Comp.Ordering: instance Data.Comp.Derive.Ordering.OrdF GHC.Base.Maybe
- Data.Comp.Show: instance Data.Comp.Derive.Show.ShowF GHC.Base.Maybe
+ Data.Comp.Annotation: infixr 7 :&:
+ Data.Comp.Annotation: infixr 8 :*:
+ Data.Comp.Arbitrary: instance Data.Comp.Derive.Arbitrary.ArbitraryF GHC.Maybe.Maybe
+ Data.Comp.DeepSeq: instance Data.Comp.Derive.DeepSeq.NFDataF GHC.Maybe.Maybe
+ Data.Comp.Equality: instance Data.Comp.Derive.Equality.EqF GHC.Maybe.Maybe
+ Data.Comp.Mapping: infix 1 |->
+ Data.Comp.Mapping: infixr 0 &
+ Data.Comp.Multi.Annotation: infixr 7 :&:
+ Data.Comp.Multi.HFunctor: infixl 5 :.:
+ Data.Comp.Multi.HFunctor: infixr 0 :=>
+ Data.Comp.Multi.Mapping: infix 1 |->
+ Data.Comp.Multi.Mapping: infixr 0 &
+ Data.Comp.Multi.Ops: infixl 5 :<:
+ Data.Comp.Multi.Ops: infixr 6 :+:
+ Data.Comp.Multi.Ops: infixr 7 :&:
+ Data.Comp.Multi.Ops: infixr 8 :*:
+ Data.Comp.Multi.Ops: type family Elem (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) :: Emb
+ Data.Comp.Multi.Projection: infixl 5 :<
+ Data.Comp.Multi.Projection: infixr 8 :*:
+ Data.Comp.Multi.Sum: infixl 5 :<:
+ Data.Comp.Multi.Sum: infixr 6 :+:
+ Data.Comp.Ops: infixl 5 :=:
+ Data.Comp.Ops: infixr 6 :+:
+ Data.Comp.Ops: infixr 7 :&:
+ Data.Comp.Ops: infixr 8 :*:
+ Data.Comp.Ops: type family Elem (f :: * -> *) (g :: * -> *) :: Emb
+ Data.Comp.Ordering: instance Data.Comp.Derive.Ordering.OrdF GHC.Maybe.Maybe
+ Data.Comp.Projection: infixl 5 :<
+ Data.Comp.Show: instance Data.Comp.Derive.Show.ShowF GHC.Maybe.Maybe
+ Data.Comp.Sum: infixl 5 :=:
+ Data.Comp.Sum: infixr 6 :+:
- Data.Comp.Algebra: apo :: (Functor f) => RCoalg f a -> a -> Term f
+ Data.Comp.Algebra: apo :: Functor f => RCoalg f a -> a -> Term f
- Data.Comp.Algebra: appCxt :: (Functor f) => Context f (Cxt h f a) -> Cxt h f a
+ Data.Comp.Algebra: appCxt :: Functor f => Context f (Cxt h f a) -> Cxt h f a
- Data.Comp.Algebra: appHom' :: forall f g. (Functor g) => Hom f g -> CxtFun f g
+ Data.Comp.Algebra: appHom' :: forall f g. Functor g => Hom f g -> CxtFun f g
- Data.Comp.Algebra: appSigFun :: (Functor f) => SigFun f g -> CxtFun f g
+ Data.Comp.Algebra: appSigFun :: Functor f => SigFun f g -> CxtFun f g
- Data.Comp.Algebra: appSigFun' :: (Functor g) => SigFun f g -> CxtFun f g
+ Data.Comp.Algebra: appSigFun' :: Functor g => SigFun f g -> CxtFun f g
- Data.Comp.Algebra: cata :: forall f a. (Functor f) => Alg f a -> Term f -> a
+ Data.Comp.Algebra: cata :: forall f a. Functor f => Alg f a -> Term f -> a
- Data.Comp.Algebra: cata' :: (Functor f) => Alg f a -> Cxt h f a -> a
+ Data.Comp.Algebra: cata' :: Functor f => Alg f a -> Cxt h f a -> a
- Data.Comp.Algebra: compAlg :: (Functor g) => Alg g a -> Hom f g -> Alg f a
+ Data.Comp.Algebra: compAlg :: Functor g => Alg g a -> Hom f g -> Alg f a
- Data.Comp.Algebra: compAlgSigFunM :: (Monad m) => AlgM m g a -> SigFunM m f g -> AlgM m f a
+ Data.Comp.Algebra: compAlgSigFunM :: Monad m => AlgM m g a -> SigFunM m f g -> AlgM m f a
- Data.Comp.Algebra: compHomSigFunM :: (Monad m) => HomM m g h -> SigFunM m f g -> HomM m f h
+ Data.Comp.Algebra: compHomSigFunM :: Monad m => HomM m g h -> SigFunM m f g -> HomM m f h
- Data.Comp.Algebra: compSigFunHom :: (Functor g) => SigFun g h -> Hom f g -> Hom f h
+ Data.Comp.Algebra: compSigFunHom :: Functor g => SigFun g h -> Hom f g -> Hom f h
- Data.Comp.Algebra: compSigFunM :: (Monad m) => SigFunM m g h -> SigFunM m f g -> SigFunM m f h
+ Data.Comp.Algebra: compSigFunM :: Monad m => SigFunM m g h -> SigFunM m f g -> SigFunM m f h
- Data.Comp.Algebra: free :: forall f h a b. (Functor f) => Alg f b -> (a -> b) -> Cxt h f a -> b
+ Data.Comp.Algebra: free :: forall f h a b. Functor f => Alg f b -> (a -> b) -> Cxt h f a -> b
- Data.Comp.Algebra: hom :: (Functor g) => SigFun f g -> Hom f g
+ Data.Comp.Algebra: hom :: Functor g => SigFun f g -> Hom f g
- Data.Comp.Algebra: para :: (Functor f) => RAlg f a -> Term f -> a
+ Data.Comp.Algebra: para :: Functor f => RAlg f a -> Term f -> a
- Data.Comp.Algebra: sigFunM :: (Monad m) => SigFun f g -> SigFunM m f g
+ Data.Comp.Algebra: sigFunM :: Monad m => SigFun f g -> SigFunM m f g
- Data.Comp.Annotation: data ( f (:*:) g ) a
+ Data.Comp.Annotation: data ( f :*: g ) a
- Data.Comp.Annotation: liftA :: (RemA s s') => (s' a -> t) -> s a -> t
+ Data.Comp.Annotation: liftA :: RemA s s' => (s' a -> t) -> s a -> t
- Data.Comp.Decompose: Fun :: (Const f) -> [a] -> Decomp f v a
+ Data.Comp.Decompose: Fun :: Const f -> [a] -> Decomp f v a
- Data.Comp.Decompose: arguments :: (Foldable f) => f a -> [a]
+ Data.Comp.Decompose: arguments :: Foldable f => f a -> [a]
- Data.Comp.Decompose: structure :: (Functor f) => f a -> Const f
+ Data.Comp.Decompose: structure :: Functor f => f a -> Const f
- Data.Comp.Derive: class Foldable (t :: * -> *)
+ Data.Comp.Derive: class Foldable (t :: Type -> Type)
- Data.Comp.Derive: class (Functor t, Foldable t) => Traversable (t :: * -> *)
+ Data.Comp.Derive: class (Functor t, Foldable t) => Traversable (t :: Type -> Type)
- Data.Comp.Derive: haskellStrict :: (Monad m, HaskellStrict f, f :<: m :+: g) => f (TermT m g) -> TermT m g
+ Data.Comp.Derive: haskellStrict :: (Monad m, HaskellStrict f, f :<: (m :+: g)) => f (TermT m g) -> TermT m g
- Data.Comp.Derive: haskellStrict' :: (Monad m, HaskellStrict f, f :<: m :+: g) => f (TermT m g) -> TermT m g
+ Data.Comp.Derive: haskellStrict' :: (Monad m, HaskellStrict f, f :<: (m :+: g)) => f (TermT m g) -> TermT m g
- Data.Comp.Generic: transform :: (Functor f) => (Term f -> Term f) -> Term f -> Term f
+ Data.Comp.Generic: transform :: Functor f => (Term f -> Term f) -> Term f -> Term f
- Data.Comp.Generic: transform' :: (Functor f) => (Term f -> Maybe (Term f)) -> Term f -> Term f
+ Data.Comp.Generic: transform' :: Functor f => (Term f -> Maybe (Term f)) -> Term f -> Term f
- Data.Comp.Mapping: class (Functor t, Foldable t) => Traversable (t :: * -> *)
+ Data.Comp.Mapping: class (Functor t, Foldable t) => Traversable (t :: Type -> Type)
- Data.Comp.Multi.Algebra: apo :: forall f a. (HFunctor f) => RCoalg f a -> a :-> Term f
+ Data.Comp.Multi.Algebra: apo :: forall f a. HFunctor f => RCoalg f a -> a :-> Term f
- Data.Comp.Multi.Algebra: appHom' :: forall f g. (HFunctor g) => Hom f g -> CxtFun f g
+ Data.Comp.Multi.Algebra: appHom' :: forall f g. HFunctor g => Hom f g -> CxtFun f g
- Data.Comp.Multi.Algebra: appSigFun :: forall f g. (HFunctor f) => SigFun f g -> CxtFun f g
+ Data.Comp.Multi.Algebra: appSigFun :: forall f g. HFunctor f => SigFun f g -> CxtFun f g
- Data.Comp.Multi.Algebra: appSigFun' :: forall f g. (HFunctor g) => SigFun f g -> CxtFun f g
+ Data.Comp.Multi.Algebra: appSigFun' :: forall f g. HFunctor g => SigFun f g -> CxtFun f g
- Data.Comp.Multi.Algebra: compAlg :: (HFunctor g) => Alg g a -> Hom f g -> Alg f a
+ Data.Comp.Multi.Algebra: compAlg :: HFunctor g => Alg g a -> Hom f g -> Alg f a
- Data.Comp.Multi.Algebra: compSigFunM :: (Monad m) => SigFunM m g h -> SigFunM m f g -> SigFunM m f h
+ Data.Comp.Multi.Algebra: compSigFunM :: Monad m => SigFunM m g h -> SigFunM m f g -> SigFunM m f h
- Data.Comp.Multi.Algebra: free :: forall f h a b. (HFunctor f) => Alg f b -> (a :-> b) -> Cxt h f a :-> b
+ Data.Comp.Multi.Algebra: free :: forall f h a b. HFunctor f => Alg f b -> (a :-> b) -> Cxt h f a :-> b
- Data.Comp.Multi.Algebra: hom :: (HFunctor g) => SigFun f g -> Hom f g
+ Data.Comp.Multi.Algebra: hom :: HFunctor g => SigFun f g -> Hom f g
- Data.Comp.Multi.Algebra: para :: forall f a. (HFunctor f) => RAlg f a -> Term f :-> a
+ Data.Comp.Multi.Algebra: para :: forall f a. HFunctor f => RAlg f a -> Term f :-> a
- Data.Comp.Multi.Algebra: sigFunM :: (Monad m) => SigFun f g -> SigFunM m f g
+ Data.Comp.Multi.Algebra: sigFunM :: Monad m => SigFun f g -> SigFunM m f g
- Data.Comp.Multi.Annotation: (:&:) :: f g e -> a -> (:&:) f a e
+ Data.Comp.Multi.Annotation: (:&:) :: f g e -> a -> (:&:) f a (g :: * -> *) e
- Data.Comp.Multi.Annotation: data ( f (:&:) a ) (g :: * -> *) e
+ Data.Comp.Multi.Annotation: data ( f :&: a ) (g :: * -> *) e
- Data.Comp.Multi.Annotation: liftA :: (RemA s s') => (s' a :-> t) -> s a :-> t
+ Data.Comp.Multi.Annotation: liftA :: RemA s s' => (s' a :-> t) -> s a :-> t
- Data.Comp.Multi.Generic: transform :: forall f. (HFunctor f) => (Term f :-> Term f) -> Term f :-> Term f
+ Data.Comp.Multi.Generic: transform :: forall f. HFunctor f => (Term f :-> Term f) -> Term f :-> Term f
- Data.Comp.Multi.HFoldable: htoList :: (HFoldable f) => f a :=> [E a]
+ Data.Comp.Multi.HFoldable: htoList :: HFoldable f => f a :=> [E a]
- Data.Comp.Multi.HFoldable: kfoldl :: (HFoldable f) => (b -> a -> b) -> b -> f (K a) :=> b
+ Data.Comp.Multi.HFoldable: kfoldl :: HFoldable f => (b -> a -> b) -> b -> f (K a) :=> b
- Data.Comp.Multi.HFoldable: kfoldr :: (HFoldable f) => (a -> b -> b) -> b -> f (K a) :=> b
+ Data.Comp.Multi.HFoldable: kfoldr :: HFoldable f => (a -> b -> b) -> b -> f (K a) :=> b
- Data.Comp.Multi.HFunctor: A :: forall i. f i -> A f
+ Data.Comp.Multi.HFunctor: A :: (forall i. f i) -> A f
- Data.Comp.Multi.HFunctor: Comp :: (f (g e) t) -> (:.:) f t
+ Data.Comp.Multi.HFunctor: Comp :: f (g e) t -> (:.:) f (g :: (* -> *) -> * -> *) (e :: * -> *) t
- Data.Comp.Multi.HTraversable: hmapM :: (HTraversable t, (Monad m)) => NatM m a b -> NatM m (t a) (t b)
+ Data.Comp.Multi.HTraversable: hmapM :: (HTraversable t, Monad m) => NatM m a b -> NatM m (t a) (t b)
- Data.Comp.Multi.HTraversable: htraverse :: (HTraversable t, (Applicative f)) => NatM f a b -> NatM f (t a) (t b)
+ Data.Comp.Multi.HTraversable: htraverse :: (HTraversable t, Applicative f) => NatM f a b -> NatM f (t a) (t b)
- Data.Comp.Multi.Mapping: Numbered :: Int -> (a i) -> Numbered a i
+ Data.Comp.Multi.Mapping: Numbered :: Int -> a i -> Numbered a i
- Data.Comp.Multi.Ops: (:&:) :: f g e -> a -> (:&:) f a e
+ Data.Comp.Multi.Ops: (:&:) :: f g e -> a -> (:&:) f a (g :: * -> *) e
- Data.Comp.Multi.Ops: Inl :: (f h e) -> (:+:) f g e
+ Data.Comp.Multi.Ops: Inl :: f h e -> (:+:) f g (h :: * -> *) e
- Data.Comp.Multi.Ops: Inr :: (g h e) -> (:+:) f g e
+ Data.Comp.Multi.Ops: Inr :: g h e -> (:+:) f g (h :: * -> *) e
- Data.Comp.Multi.Ops: data ( f (:*:) g ) a
+ Data.Comp.Multi.Ops: data ( f :*: g ) a
- Data.Comp.Multi.Ops: inj :: forall f g a. (f :<: g) => f a :-> g a
+ Data.Comp.Multi.Ops: inj :: forall f g a. f :<: g => f a :-> g a
- Data.Comp.Multi.Ops: proj :: forall f g a. (f :<: g) => NatM Maybe (g a) (f a)
+ Data.Comp.Multi.Ops: proj :: forall f g a. f :<: g => NatM Maybe (g a) (f a)
- Data.Comp.Multi.Ops: spl :: (f :=: f1 :+: f2) => (f1 a :-> b) -> (f2 a :-> b) -> f a :-> b
+ Data.Comp.Multi.Ops: spl :: f :=: (f1 :+: f2) => (f1 a :-> b) -> (f2 a :-> b) -> f a :-> b
- Data.Comp.Multi.Projection: data ( f (:*:) g ) a
+ Data.Comp.Multi.Projection: data ( f :*: g ) a
- Data.Comp.Multi.Projection: pr :: forall p q a. (p :< q) => q a -> p a
+ Data.Comp.Multi.Projection: pr :: forall p q a. p :< q => q a -> p a
- Data.Comp.Multi.Sum: data ( f (:+:) g ) (h :: * -> *) e
+ Data.Comp.Multi.Sum: data ( f :+: g ) (h :: * -> *) e
- Data.Comp.Multi.Sum: inj :: forall f g a. (f :<: g) => f a :-> g a
+ Data.Comp.Multi.Sum: inj :: forall f g a. f :<: g => f a :-> g a
- Data.Comp.Multi.Sum: inject :: (g :<: f) => g (Cxt h f a) :-> Cxt h f a
+ Data.Comp.Multi.Sum: inject :: g :<: f => g (Cxt h f a) :-> Cxt h f a
- Data.Comp.Multi.Sum: proj :: forall f g a. (f :<: g) => NatM Maybe (g a) (f a)
+ Data.Comp.Multi.Sum: proj :: forall f g a. f :<: g => NatM Maybe (g a) (f a)
- Data.Comp.Multi.Sum: project :: (g :<: f) => NatM Maybe (Cxt h f a) (g (Cxt h f a))
+ Data.Comp.Multi.Sum: project :: g :<: f => NatM Maybe (Cxt h f a) (g (Cxt h f a))
- Data.Comp.Multi.Sum: split :: (f :=: f1 :+: f2) => (f1 (Term f) :-> a) -> (f2 (Term f) :-> a) -> Term f :-> a
+ Data.Comp.Multi.Sum: split :: f :=: (f1 :+: f2) => (f1 (Term f) :-> a) -> (f2 (Term f) :-> a) -> Term f :-> a
- Data.Comp.Multi.Term: constTerm :: (HFunctor f) => Const f :-> Term f
+ Data.Comp.Multi.Term: constTerm :: HFunctor f => Const f :-> Term f
- Data.Comp.Multi.Term: simpCxt :: (HFunctor f) => f a i -> Context f a i
+ Data.Comp.Multi.Term: simpCxt :: HFunctor f => f a i -> Context f a i
- Data.Comp.Multi.Term: toCxt :: (HFunctor f) => Term f :-> Context f a
+ Data.Comp.Multi.Term: toCxt :: HFunctor f => Term f :-> Context f a
- Data.Comp.Ops: Inl :: (f e) -> (:+:) f g e
+ Data.Comp.Ops: Inl :: f e -> (:+:) f g e
- Data.Comp.Ops: Inr :: (g e) -> (:+:) f g e
+ Data.Comp.Ops: Inr :: g e -> (:+:) f g e
- Data.Comp.Ops: data ( f (:&:) a ) e
+ Data.Comp.Ops: data ( f :&: a ) e
- Data.Comp.Ops: inj :: forall f g a. (f :<: g) => f a -> g a
+ Data.Comp.Ops: inj :: forall f g a. f :<: g => f a -> g a
- Data.Comp.Ops: proj :: forall f g a. (f :<: g) => g a -> Maybe (f a)
+ Data.Comp.Ops: proj :: forall f g a. f :<: g => g a -> Maybe (f a)
- Data.Comp.Ops: spl :: (f :=: f1 :+: f2) => (f1 a -> b) -> (f2 a -> b) -> f a -> b
+ Data.Comp.Ops: spl :: f :=: (f1 :+: f2) => (f1 a -> b) -> (f2 a -> b) -> f a -> b
- Data.Comp.Projection: pr :: forall p q. (p :< q) => q -> p
+ Data.Comp.Projection: pr :: forall p q. p :< q => q -> p
- Data.Comp.Sum: data ( f (:+:) g ) e
+ Data.Comp.Sum: data ( f :+: g ) e
- Data.Comp.Sum: deepInject_ :: (Functor g) => SigFun g f -> CxtFun g f
+ Data.Comp.Sum: deepInject_ :: Functor g => SigFun g f -> CxtFun g f
- Data.Comp.Sum: deepProject_ :: (Traversable g) => (SigFunM Maybe f g) -> CxtFunM Maybe f g
+ Data.Comp.Sum: deepProject_ :: Traversable g => SigFunM Maybe f g -> CxtFunM Maybe f g
- Data.Comp.Sum: inj :: forall f g a. (f :<: g) => f a -> g a
+ Data.Comp.Sum: inj :: forall f g a. f :<: g => f a -> g a
- Data.Comp.Sum: inject :: (g :<: f) => g (Cxt h f a) -> Cxt h f a
+ Data.Comp.Sum: inject :: g :<: f => g (Cxt h f a) -> Cxt h f a
- Data.Comp.Sum: proj :: forall f g a. (f :<: g) => g a -> Maybe (f a)
+ Data.Comp.Sum: proj :: forall f g a. f :<: g => g a -> Maybe (f a)
- Data.Comp.Sum: project :: (g :<: f) => Cxt h f a -> Maybe (g (Cxt h f a))
+ Data.Comp.Sum: project :: g :<: f => Cxt h f a -> Maybe (g (Cxt h f a))
- Data.Comp.Sum: split :: (f :=: f1 :+: f2) => (f1 (Term f) -> a) -> (f2 (Term f) -> a) -> Term f -> a
+ Data.Comp.Sum: split :: f :=: (f1 :+: f2) => (f1 (Term f) -> a) -> (f2 (Term f) -> a) -> Term f -> a
- Data.Comp.Term: constTerm :: (Functor f) => Const f -> Term f
+ Data.Comp.Term: constTerm :: Functor f => Const f -> Term f
- Data.Comp.Thunk: nfPr :: (Monad m, Traversable g, g :<: f) => TermT m f -> m (Term g)
+ Data.Comp.Thunk: nfPr :: (MonadFail m, Traversable g, g :<: f) => TermT m f -> m (Term g)
- Data.Comp.Thunk: whnfPr :: (Monad m, g :<: f) => TermT m f -> m (g (TermT m f))
+ Data.Comp.Thunk: whnfPr :: (MonadFail m, g :<: f) => TermT m f -> m (g (TermT m f))
- Data.Comp.Unification: FailedOccursCheck :: v -> (Term f) -> UnifError f v
+ Data.Comp.Unification: FailedOccursCheck :: v -> Term f -> UnifError f v
- Data.Comp.Unification: HeadSymbolMismatch :: (Term f) -> (Term f) -> UnifError f v
+ Data.Comp.Unification: HeadSymbolMismatch :: Term f -> Term f -> UnifError f v
- Data.Comp.Unification: failedOccursCheck :: (MonadError (UnifError f v) m) => v -> Term f -> m a
+ Data.Comp.Unification: failedOccursCheck :: MonadError (UnifError f v) m => v -> Term f -> m a
- Data.Comp.Unification: headSymbolMismatch :: (MonadError (UnifError f v) m) => Term f -> Term f -> m a
+ Data.Comp.Unification: headSymbolMismatch :: MonadError (UnifError f v) m => Term f -> Term f -> m a
Files
- benchmark/DataTypes.hs +4/−1
- benchmark/Functions/Comp/Eval.hs +7/−4
- benchmark/Functions/Comp/Inference.hs +11/−5
- benchmark/Functions/Standard/Eval.hs +11/−4
- compdata.cabal +128/−9
- examples/Examples/Simple.hs +0/−20
- examples/Examples/Thunk.hs +14/−12
- src/Data/Comp/Thunk.hs +8/−2
benchmark/DataTypes.hs view
@@ -1,8 +1,11 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, CPP #-} module DataTypes where +-- Control.Monad.Fail import is redundant since GHC 8.8.1+#if !MIN_VERSION_base(4,13,0) import Control.Monad.Fail+#endif type Err = Either String
benchmark/Functions/Comp/Eval.hs view
@@ -7,7 +7,8 @@ TypeOperators, ScopedTypeVariables, TypeSynonymInstances,- ConstraintKinds #-}+ ConstraintKinds,+ CPP #-} module Functions.Comp.Eval where @@ -17,10 +18,12 @@ import Data.Comp.Thunk hiding (eval, eval2) import Data.Comp.Derive -import Control.Monad.Fail-import Prelude hiding (fail)-import Control.Monad hiding (fail)+-- Control.Monad.Fail import is redundant since GHC 8.8.1+#if !MIN_VERSION_base(4,13,0)+import Control.Monad.Fail (MonadFail)+#endif +import Control.Monad -- evaluation with thunks
benchmark/Functions/Comp/Inference.hs view
@@ -7,7 +7,8 @@ TypeOperators, ScopedTypeVariables, TypeSynonymInstances,- ConstraintKinds#-}+ ConstraintKinds,+ CPP #-} module Functions.Comp.Inference where @@ -16,6 +17,11 @@ import Data.Comp import Data.Comp.Derive +-- Control.Monad.Fail import is redundant since GHC 8.8.1+#if !MIN_VERSION_base(4,13,0)+import Control.Monad.Fail (MonadFail)+#endif+ -- type inference class Monad m => InferType f t m where@@ -29,19 +35,19 @@ $(derive [liftSum] [''InferType]) -instance (ValueT :<: t, Monad m) => InferType Value t m where+instance (ValueT :<: t, MonadFail m) => InferType Value t m where inferTypeAlg (VInt _) = return $ inject TInt inferTypeAlg (VBool _) = return $ inject TBool inferTypeAlg (VPair x y) = return $ inject $ TPair x y -checkOp :: (g :<: f, Eq (g (Term f)), Monad m) =>+checkOp :: (g :<: f, Eq (g (Term f)), MonadFail m) => [g (Term f)] -> g (Term f) -> [Term f] -> m (Term f) checkOp exs et tys = if and (zipWith (\ f t -> maybe False (==f) (project t)) exs tys) then return (inject et) else fail"" -instance (ValueT :<: t, EqF t, Monad m) => InferType Op t m where+instance (ValueT :<: t, EqF t, MonadFail m) => InferType Op t m where inferTypeAlg (Plus x y) = checkOp [TInt,TInt] TInt [x ,y] inferTypeAlg (Mult x y) = checkOp [TInt,TInt] TInt [x ,y] inferTypeAlg (Lt x y) = checkOp [TInt,TInt] TBool [x ,y]@@ -58,7 +64,7 @@ ProjRight -> return x2 _ -> fail "" -instance (ValueT :<: t, EqF t, Monad m) => InferType Sugar t m where+instance (ValueT :<: t, EqF t, MonadFail m) => InferType Sugar t m where inferTypeAlg (Minus x y) = checkOp [TInt,TInt] TInt [x ,y] inferTypeAlg (Neg x) = checkOp [TInt] TInt [x] inferTypeAlg (Gt x y) = checkOp [TInt,TInt] TBool [x ,y]
benchmark/Functions/Standard/Eval.hs view
@@ -1,22 +1,29 @@+{-# LANGUAGE CPP #-}+ module Functions.Standard.Eval where import DataTypes.Standard import Functions.Standard.Desugar import Control.Monad -coerceInt :: (Monad m) => SExpr -> m Int+-- Control.Monad.Fail import is redundant since GHC 8.8.1+#if !MIN_VERSION_base(4,13,0)+import Control.Monad.Fail (MonadFail)+#endif++coerceInt :: (MonadFail m) => SExpr -> m Int coerceInt (SInt i) = return i coerceInt _ = fail "" -coerceBool :: (Monad m) => SExpr -> m Bool+coerceBool :: (MonadFail m) => SExpr -> m Bool coerceBool (SBool b) = return b coerceBool _ = fail "" -coercePair :: (Monad m) => SExpr -> m (SExpr,SExpr)+coercePair :: (MonadFail m) => SExpr -> m (SExpr,SExpr) coercePair (SPair x y) = return (x,y) coercePair _ = fail "" -eval :: (Monad m) => OExpr -> m SExpr+eval :: (MonadFail m) => OExpr -> m SExpr eval (OInt i) = return $ SInt i eval (OBool b) = return $ SBool b eval (OPair x y) = liftM2 SPair (eval x) (eval y)
compdata.cabal view
@@ -1,5 +1,5 @@ Name: compdata-Version: 0.12+Version: 0.12.1 Synopsis: Compositional Data Types Description: @@ -98,7 +98,7 @@ Author: Patrick Bahr, Tom Hvitved Maintainer: paba@itu.dk Build-Type: Simple-Cabal-Version: >=1.9.2+Cabal-Version: >=1.12 bug-reports: https://github.com/pa-ba/compdata/issues extra-source-files:@@ -190,10 +190,11 @@ - Build-Depends: base >= 4.7, base < 5, template-haskell, containers, mtl >= 2.2.1,+ Build-Depends: base >= 4.9, base < 5, template-haskell, containers, mtl >= 2.2.1, QuickCheck >= 2, deepseq, transformers, th-expand-syns, tree-view >= 0.5- Extensions: FlexibleContexts+ Default-Language: Haskell2010 + Default-Extensions: FlexibleContexts hs-source-dirs: src ghc-options: -W @@ -202,12 +203,87 @@ Type: exitcode-stdio-1.0 Main-is: Data_Test.hs hs-source-dirs: testsuite/tests examples src- Build-Depends: base >= 4.7, base < 5, template-haskell, containers, mtl >= 2.2.1,+ Build-Depends: base >= 4.9, base < 5, template-haskell, containers, mtl >= 2.2.1, QuickCheck >= 2, HUnit, test-framework, test-framework-hunit, test-framework-quickcheck2 >= 0.3, deepseq, transformers, th-expand-syns ghc-options: -W -Wno-incomplete-patterns- + Other-Modules:+ Data.Comp+ Data.Comp.Algebra+ Data.Comp.Annotation+ Data.Comp.Arbitrary+ Data.Comp.Derive+ Data.Comp.Derive.Arbitrary+ Data.Comp.Derive.DeepSeq+ Data.Comp.Derive.Equality+ Data.Comp.Derive.Foldable+ Data.Comp.Derive.HaskellStrict+ Data.Comp.Derive.Ordering+ Data.Comp.Derive.Show+ Data.Comp.Derive.SmartAConstructors+ Data.Comp.Derive.SmartConstructors+ Data.Comp.Derive.Traversable+ Data.Comp.Derive.Utils+ Data.Comp.Desugar+ Data.Comp.Equality+ Data.Comp.Equality_Test+ Data.Comp.Examples.Comp+ Data.Comp.Examples.Multi+ Data.Comp.Examples_Test+ Data.Comp.Generic+ Data.Comp.Mapping+ Data.Comp.Multi+ Data.Comp.Multi.Algebra+ Data.Comp.Multi.Annotation+ Data.Comp.Multi.Derive+ Data.Comp.Multi.Derive.Equality+ Data.Comp.Multi.Derive.HFoldable+ Data.Comp.Multi.Derive.HFunctor+ Data.Comp.Multi.Derive.HTraversable+ Data.Comp.Multi.Derive.Ordering+ Data.Comp.Multi.Derive.Show+ Data.Comp.Multi.Derive.SmartAConstructors+ Data.Comp.Multi.Derive.SmartConstructors+ Data.Comp.Multi.Desugar+ Data.Comp.Multi.Equality+ Data.Comp.Multi.Generic+ Data.Comp.Multi.HFoldable+ Data.Comp.Multi.HFunctor+ Data.Comp.Multi.HTraversable+ Data.Comp.Multi.Mapping+ Data.Comp.Multi.Ops+ Data.Comp.Multi.Ordering+ Data.Comp.Multi.Show+ Data.Comp.Multi.Sum+ Data.Comp.Multi.Term+ Data.Comp.Multi.Variables+ Data.Comp.Multi.Variables_Test+ Data.Comp.Multi_Test+ Data.Comp.Ops+ Data.Comp.Ordering+ Data.Comp.Show+ Data.Comp.SubsumeCommon+ Data.Comp.Subsume_Test+ Data.Comp.Sum+ Data.Comp.Term+ Data.Comp.Thunk+ Data.Comp.Variables+ Data.Comp.Variables_Test+ Data.Comp_Test+ Examples.Common+ Examples.Desugar+ Examples.Eval+ Examples.EvalM+ Examples.Thunk+ Examples.Multi.Common+ Examples.Multi.Desugar+ Examples.Multi.Eval+ Examples.Multi.EvalI+ Examples.Multi.EvalM+ Test.Utils+ Default-Language: Haskell2010+ Benchmark algebra Type: exitcode-stdio-1.0 Main-is: Benchmark.hs@@ -215,11 +291,54 @@ ghc-options: -W -O2 -- Disable short-cut fusion rules in order to compare optimised and unoptimised code. cpp-options: -DNO_RULES- Build-Depends: base >= 4.7, base < 5, template-haskell, containers, mtl >= 2.2.1,+ Build-Depends: base >= 4.9, base < 5, template-haskell, containers, mtl >= 2.2.1, QuickCheck >= 2, deepseq, criterion, random, uniplate, transformers, th-expand-syns--+ Other-Modules:+ Data.Comp+ Data.Comp.Algebra+ Data.Comp.Annotation+ Data.Comp.Arbitrary+ Data.Comp.DeepSeq+ Data.Comp.Derive+ Data.Comp.Derive.Arbitrary+ Data.Comp.Derive.DeepSeq+ Data.Comp.Derive.Equality+ Data.Comp.Derive.Foldable+ Data.Comp.Derive.HaskellStrict+ Data.Comp.Derive.Ordering+ Data.Comp.Derive.Show+ Data.Comp.Derive.SmartAConstructors+ Data.Comp.Derive.SmartConstructors+ Data.Comp.Derive.Traversable+ Data.Comp.Derive.Utils+ Data.Comp.Equality+ Data.Comp.Generic+ Data.Comp.Mapping+ Data.Comp.Ops+ Data.Comp.Ordering+ Data.Comp.Show+ Data.Comp.SubsumeCommon+ Data.Comp.Sum+ Data.Comp.Term+ Data.Comp.Thunk+ Data.Comp.Variables+ DataTypes+ DataTypes.Comp+ DataTypes.Standard+ DataTypes.Transform+ Functions.Comp+ Functions.Comp.Desugar+ Functions.Comp.Eval+ Functions.Comp.FreeVars+ Functions.Comp.Inference+ Functions.Standard+ Functions.Standard.Desugar+ Functions.Standard.Eval+ Functions.Standard.FreeVars+ Functions.Standard.Inference+ Default-Language: Haskell2010+ source-repository head type: git location: https://github.com/pa-ba/compdata
− examples/Examples/Simple.hs
@@ -1,20 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE MultiParamTypeClasses #-}-module Examples.Simple where--import Data.Comp--data Lambda t a = App a a | Abs (Maybe (Term t)) -data Arith a = Const Int---data LambdaType a = Fun a a--data IntType a = IntType--type Type = LambdaType :+: IntType--type Sig t = Lambda t :+: Arith--
examples/Examples/Thunk.hs view
@@ -1,5 +1,6 @@-{-# LANGUAGE TemplateHaskell, TypeOperators, MultiParamTypeClasses,- FlexibleInstances, FlexibleContexts, UndecidableInstances, ConstraintKinds #-}+{-# LANGUAGE TemplateHaskell, TypeOperators, MultiParamTypeClasses, DeriveFunctor,+ FlexibleInstances, FlexibleContexts, UndecidableInstances, ConstraintKinds,+ CPP #-} -------------------------------------------------------------------------------- -- | -- Module : Examples.Thunk@@ -23,25 +24,30 @@ import Data.Comp.Show() import Examples.Common hiding (Value(..), Sig, iConst, iPair) +-- Control.Monad.Fail import is redundant since GHC 8.8.1+#if !MIN_VERSION_base(4,13,0)+import Control.Monad.Fail+#endif+ -- Signature for values, strict pairs-data Value a = Const Int | Pair !a !a+data Value a = Const Int | Pair !a !a deriving Functor -- Signature for the simple expression language type Sig = Op :+: Value -- Derive boilerplate code using Template Haskell-$(derive [makeFunctor, makeTraversable, makeFoldable,+$(derive [makeTraversable, makeFoldable, makeEqF, makeShowF, smartConstructors, makeHaskellStrict] [''Value]) -- Monadic term evaluation algebra class EvalT f m v where- evalAlgT :: Monad m => AlgT m f v+ evalAlgT :: MonadFail m => AlgT m f v $(derive [liftSum] [''EvalT]) -- Lift the monadic evaluation algebra to a monadic catamorphism-evalT :: (Traversable v, Functor f, EvalT f m v, Monad m) => Term f -> m (Term v)+evalT :: (Traversable v, Functor f, EvalT f m v, MonadFail m) => Term f -> m (Term v) evalT = nf . cata evalAlgT instance (Value :<: m :+: v) => EvalT Value m v where@@ -71,12 +77,8 @@ return y -{-instance Monad (Either String) where- Left msg >>= _ = Left msg- Right x >>= f = f x- - return = Right- fail = Left-}+instance MonadFail (Either String) where+ fail = Left evalTEx :: Either String (Term Value) evalTEx = evalT (iSnd (iFst (iConst 5) `iPair` iConst 4) :: Term Sig)
src/Data/Comp/Thunk.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -53,6 +54,11 @@ import Control.Monad hiding (mapM, sequence) import Data.Traversable +-- Control.Monad.Fail import is redundant since GHC 8.8.1+#if !MIN_VERSION_base(4,13,0)+import Control.Monad.Fail (MonadFail)+#endif+ import Prelude hiding (foldl, foldl1, foldr, foldr1, mapM, sequence) @@ -80,7 +86,7 @@ -- 'whnf' and then projects the top-level signature to the desired -- subsignature. Failure to do the projection is signalled as a -- failure in the monad.-whnfPr :: (Monad m, g :<: f) => TermT m f -> m (g (TermT m f))+whnfPr :: (MonadFail m, g :<: f) => TermT m f -> m (g (TermT m f)) whnfPr t = do res <- whnf t case proj res of Just res' -> return res'@@ -111,7 +117,7 @@ -- | This function evaluates all thunks while simultaneously -- projecting the term to a smaller signature. Failure to do the -- projection is signalled as a failure in the monad as in 'whnfPr'.-nfPr :: (Monad m, Traversable g, g :<: f) => TermT m f -> m (Term g)+nfPr :: (MonadFail m, Traversable g, g :<: f) => TermT m f -> m (Term g) nfPr = liftM Term . mapM nfPr <=< whnfPr -- | This function inspects a term (using 'nf') according to the