mfsolve 0.3.0 → 0.3.1.0
raw patch · 2 files changed
+28/−9 lines, 2 files
Files
- Math/MFSolve.hs +27/−8
- mfsolve.cabal +1/−1
Math/MFSolve.hs view
@@ -81,7 +81,8 @@ SimpleExpr(..), Expr, LinExpr(..), UnaryOp(..), BinaryOp(..), SimpleVar(..), makeVariable,- makeConstant, evalExpr, fromSimple, toSimple, evalSimple, hasVar, + makeConstant, evalExpr, fromSimple, toSimple, evalSimple, hasVar,+ mapSimple, mapExpr, -- * Dependencies Dependencies, DepError(..), noDeps, addEquation, eliminate,@@ -104,7 +105,6 @@ import Control.Monad.Reader import Control.Monad.Writer import Control.Monad.Identity-import Control.Monad.RWS import Control.Monad.Cont import Control.Exception import Data.Typeable@@ -412,6 +412,20 @@ evalSimple g s (SEUn f e) = evalUn f (evalSimple g s e) +-- | map a simple expression using the given substitution.+mapSimple :: (Floating m, Floating n) => (n -> m) -> (v -> u) -> SimpleExpr v n -> SimpleExpr u m+mapSimple _ g (Var v) = Var (g v)+mapSimple f _ (Const c) = Const (f c)+mapSimple f g (SEBin h e1 e2) =+ SEBin h (mapSimple f g e1) (mapSimple f g e2)+mapSimple f g (SEUn h e) =+ SEUn h (mapSimple f g e)++-- | map an expression using the given substitution.+mapExpr :: (Floating m, Floating n, Ord u, Ord v, Eq n, Ord m) =>+ (n -> m) -> (v -> u) -> Expr v n -> Expr u m+mapExpr f g = fromSimple . mapSimple f g . toSimple+ -- | Make a expression from a simple expression. fromSimple :: (Floating n, Ord n, Ord v) => SimpleExpr v n -> Expr v n fromSimple = evalSimple makeConstant makeVariable@@ -1025,15 +1039,20 @@ RealFrac n, Floating n, Ord v) => (Expr v n, Expr v n) -> (Expr v n, Expr v n) -> m () (=&=) (a, b) (c, d) =- do ignore $ a === c- b === d+ do catchError (a === c) $ \e ->+ case e of+ RedundantEq ->+ b === d+ _ -> throwError e+ ignore $ b === d -- | Succeed even when trowing a `RedundantEq` error. ignore :: MonadError (DepError v n) m => m () -> m ()-ignore m = m `catchError` (- \e -> case e of- RedundantEq -> return ()- _ -> throwError e)+ignore m =+ catchError m $ \e ->+ case e of+ RedundantEq -> return ()+ _ -> throwError e -- | run the solver. runSolver :: MFSolver v n a -> Dependencies v n -> Either (DepError v n) (a, Dependencies v n)
mfsolve.cabal view
@@ -1,5 +1,5 @@ Name: mfsolve-Version: 0.3.0+Version: 0.3.1.0 Synopsis: Equation solver and calculator à la metafont Category: Math Copyright: Kristof Bastiaensen (2015)