aboutsummaryrefslogtreecommitdiff
path: root/src/expr.hs
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-03-14 12:41:34 +0100
committerCharles <sircharlesaze@gmail.com>2020-03-14 12:41:34 +0100
commit18c9cfd7c1fb4baf1789f178a8d56ddb8f0f1456 (patch)
tree7ad79406c98e0ed520a852616e9d8d48de6ab54d /src/expr.hs
parente0ade28ab642c043501493fe7192b626a6a68115 (diff)
downloadcomputorv2-18c9cfd7c1fb4baf1789f178a8d56ddb8f0f1456.tar.gz
computorv2-18c9cfd7c1fb4baf1789f178a8d56ddb8f0f1456.tar.bz2
computorv2-18c9cfd7c1fb4baf1789f178a8d56ddb8f0f1456.zip
Draft expr compatibility
Diffstat (limited to 'src/expr.hs')
-rw-r--r--src/expr.hs206
1 files changed, 177 insertions, 29 deletions
diff --git a/src/expr.hs b/src/expr.hs
index ccc0e36..c69948e 100644
--- a/src/expr.hs
+++ b/src/expr.hs
@@ -1,41 +1,189 @@
module Expr where
-import Imag
-import Matrix
+import Data.List
--- data X = Expr | Imag | Matrix
+type Label = String
--- class ExprElement where
--- subExpr :: ExprElement a => a -> a
--- composed :: ExprElement a -> a -> (a, a)
+class Expression where
+ eval :: Expression a => a -> Maybe a
+ eval (Context _ e) = Just e
+ interpret :: Context a -> a
+ reduce :: Expression a => a -> a
+ reduce e = e
-data AExpr = AExpr Term AExpr | AExprSingle Term
-data Term = Term Factor Term | TermSingle Factor
-data Factor = Factor Base Factor | FactorSingle Base
-data Base = Base AExpr | BaseSingle Expr
+-- class ExpressionNum where
+-- evalNum :: ExpressionNum a, Num a => Context a -> Maybe a
+-- evalNum (Context c n) = eval n
-data Expr = ExprF Float | ExprI Imag | ExprM (Matrix AExpr)
-instance Show AExpr where
- show (AExprSingle t) = show t
- show (AExpr t e) = show t ++ " + " ++ show e
+-- leaf type
+newtype Rational = Float deriving (Expression)
+newtype Imaginary = Float deriving (Expression)
+newtype Matrix a = [MatrixRow a]
+type MatrixRow a = [a]
+type Var = Label
-instance Show Term where
- show (TermSingle f) = show f
- show (Term f t) = show f ++ " * " ++ show t
+-- recursive types
+data Func a = Func
+ { name :: Label
+ , argument :: a
+ }
-instance Show Factor where
- show (FactorSingle b) = show b
- show (Factor b f) = show b ++ " ^ " ++ show f
+class MaybeNum where
+ (+) :: a -> b -> Maybe c
+ _ + _ = Nothing
-instance Show Base where
- show (BaseSingle x) = show x
- show (Base e) = "(" ++ show e ++ ")"
+ (-) :: a -> b -> Maybe c
+ _ - _ = Nothing
-instance Show Expr where
- show (ExprF f) = show f
- show (ExprI i) = show i
- show (ExprM m) = show m
+ (*) :: a -> b -> Maybe c
+ _ * _ = Nothing
+
+ (/) :: a -> b -> Maybe c
+ _ / _ = Nothing
+
+ (%) :: a -> b -> Maybe c
+ _ % _ = Nothing
+
+ (^) :: a -> b -> Maybe c
+ _ ^ _ = Nothing
+
+ (**) :: a -> b -> Maybe c
+ _ ** _ = Nothing
+
+
+instance MaybeNum Rational where
+ (Rational a) + (Rational b) = Just (a + b)
+ (Rational a) + (Imaginary b) = Just (Complex a b)
+
+ (Rational a) - (Rational b) = Just (a - b)
+ (Rational a) - (Imaginary b) = Just (Complex a (-b))
+
+ (Rational a) * (Rational b) = Just (a * b)
+ (Rational a) * (Imaginary b) = Just (Imag (a * b))
+ (Rational a) * (Matrix b) = Just (fmap (a*) b)
+
+ _ / (Rational 0) = Nothing
+ (Rational a) / (Rational b) = Just (a * b)
+ -- x / yi possible?
+
+ -- (Rational a) % (Rational b) = Nothing
+
+ (Rational a) ^ (Rational b) = Just (a ^ b)
+
+instance MaybeNum Imaginary where
+ (Imaginary a) + (Imaginary b) = Just $ Imaginary (a + b)
+ (Imaginary a) + (Rational b) = Just (Complex b a)
+
+ (Imaginary a) - (Imaginary b) = Just $ Imaginary (a - b)
+ (Imaginary a) - (Rational b) = Just $ Complex (-b) a
+
+ (Imaginary a) * (Imaginary b) = Just $ Imaginary (a * b)
+
+ (Imaginary a) ^ (Rational 0) = Just $ Rational a
+ (Imaginary a) ^ (Rational 1) = Just $ Imaginary a
+ (Imaginary a) ^ (Rational 2) = Just $ Rational (-a)
+ (Imaginary a) ^ (Rational 3) = Just $ Imaginary (-a)
+ (Imaginary a) ^ (Rational b) = Just $ a ^ (b - 4)
+
+instance MaybeNum Matrix where
+ (Matrix a) + (Matrix b) = if shape a == shape b then Just $ (+) <$> a <*> b
+ else Nothing
+ (Matrix a) - (Matrix b) = if shape a == shape b then Just $ (-) <$> a <*> b
+ else Nothing
+ (Matrix a) * (Rational b) = Just $ fmap (*b) a
+ (Matrix a) / (Rational b) = Just $ fmap (/b) a
+
+ (Matrix a) ^ (Rational 1) = Just a
+ (Matrix a) ^ (Rational b) = if isSquare a then a ** (a ^ (b - 1))
+ else Nothing
+
+ (Matrix a) ** (Matrix b) = undefined
+
+
+data (Evaluable a, MaybeNum b) => Ast a b = Operation a (Ast a b) (Ast a b) | Operand b
+
+instance Functor Ast where
+ fmap f (Operation op l r) = Operation op (fmap f l) (fmap f r)
+ fmap f (Operand x) = Operand (f x)
+
+--
+-- data BinExpr a a = BinExpr a a | BinEmpty
+-- data Sum = Sum Term Sum | SumSingle Term
+-- data Term = Term Factor Term | TermSingle Factor
+-- data Factor = Factor Base Factor | FactorSingle Base
+-- data Base = Base Expr | BaseSingle Expr
+
+-- data X a = X a X | XSingle a
+
+
+
+-- data Sum a = Sum a a
+
+-- instance Expression a, Num a => Expression (Sum a) where
+-- eval (Context c (Sum x y)) = (+) <$> eval (Context c x) <*> eval (Context c y)
+--
+-- data Multiplication a = Multiplication a a
+-- instance Expression a, Num a => Expression (Multiplication a) where
+-- eval (Context c (Multiplication x y)) = (*) <$> eval (Context c x) <*> eval (Context c y)
+
+Bin b => b a (a -> a -> a) -> a
+x f = f <$> eval fst x <*> eval snd x
+
+-- dot :: Matrix a -> Matrix a -> a
+
+-- evalNum :: Num a => (a -> a -> a) -> b a -> b a -> Maybe a
+-- evalNum f x y = f <$> eval x <*> eval y
+
+
+-- data FuncExpr = FuncExpr
+-- { getName :: String
+-- , getParam :: Expr
+-- }
+
+-- data Expr
+-- = ExprR Real
+-- | ExprI Imag
+-- | ExprM (Matrix Expr)
+-- | ExprV Var
+-- | ExprF FuncEval
+
+
+data FuncDecl = FuncDecl
+ { getName :: String
+ , getArg :: String
+ , getContent :: Expr
+ }
+
+instance Show a => Show (Matrix a) where
+ show (Matrix m) = intercalate "\n" (map showLine m)
+ where showLine l = "[ " ++ intercalate " , " (map show l) ++ " ]"
+
+instance Show Imag where
+ show (Imag i) = show i ++ "i"
+
+-- instance Show AExpr where
+-- show (AExprSingle t) = show t
+-- show (AExpr t e) = show t ++ " + " ++ show e
+--
+-- instance Show Term where
+-- show (TermSingle f) = show f
+-- show (Term f t) = show f ++ " * " ++ show t
+--
+-- instance Show Factor where
+-- show (FactorSingle b) = show b
+-- show (Factor b f) = show b ++ " ^ " ++ show f
+--
+-- instance Show Base where
+-- show (BaseSingle x) = show x
+-- show (Base e) = "(" ++ show e ++ ")"
+--
+-- instance Show FuncExpr where
+-- show (FuncExpr name arg) = (init $ tail (show name)) ++ "(" ++ (show arg) ++ ")"
+--
+-- instance Show Expr where
+-- show (ExprR r) = show r
+-- show (ExprI i) = show i
+-- show (ExprM m) = show m
+-- show (ExprV v) = init $ tail (show v)
--- eval :: Expr -> Float
--- eval