Expression (01)

Dark Magus 2012-10-30 15:39:17.204868 UTC

1{-# OPTIONS_HADDOCK prune, ignore-exports #-}
2
3{------------------------------------------------------------------------------}
4{- | Модуль, содержащий описание программных сущностей для выполнения символьных
5 вычислений.
6
7 Автор: Душкин Р. В.
8 Проект: SymbolicComputations
9 Версия: 0.01 -}
10{------------------------------------------------------------------------------}
11
12module Expression_01
13(
14 -- * Алгебраические типы данных
15 Expression(..)
16)
17where
18
19{-[ СЕКЦИЯ ИМПОРТА ]-----------------------------------------------------------}
20
21import Data.Function (on)
22
23{-[ АЛГЕБРАИЧЕСКИЕ ТИПЫ ДАННЫХ ]-----------------------------------------------}
24
25-- | Основной тип, представляющий символьное выражение. В данной версии
26-- реализации символьное выражение может быть просто числом, отрицанием
27-- символьного выражение, квадратным корнем из символьного выражения,
28-- отношением двух символьных выражений и применением бинарной операции
29-- (\+\, \-\, \*\) к двум символьным выражениям.
30data Expression a
31 = Number -- ^ Просто число.
32 {
33 number :: a -- ^ Число.
34 }
35 | Negation -- ^ Отрицание символьного выражения.
36 {
37 negation :: Expression a -- ^ Выражение.
38 }
39 | Sqrt -- ^ Квадратный корень из символьного выражения.
40 {
41 squareRoot :: Expression a -- ^ Подкоренное выражение.
42 }
43 | Fraction -- ^ Отношение двух символьных выражений.
44 {
45 numerator :: Expression a, -- ^ Числитель.
46 denominator :: Expression a -- ^ Знаменатель.
47 }
48 | Operation -- ^ Некая бинарная операция между двумя символьными выражениями.
49 {
50 operator :: a -> a -> a, -- ^ Бинарная операция.
51 operandX :: Expression a, -- ^ Первый операнд.
52 operandY :: Expression a -- ^ Второй операнд.
53 }
54
55{-[ ЭКЗЕМПЛЯРЫ КЛАССОВ ]-------------------------------------------------------}
56
57instance (Eq a, Integral a, Floating a) => Eq (Expression a) where
58 (==) = error "Eq.(==)"
59
60instance (Num a, Integral a, Floating a) => Num (Expression a) where
61 (+) = error "Num.(+)"
62 (-) = error "Num.(-)"
63 (*) = error "Num.(*)"
64 negate = error "Num.negate"
65 abs = error "Num.abs"
66 signum = error "Num.signum"
67 fromInteger = error "Num.fromInteger"
68
69instance (Enum a, Floating a, Integral a) => Enum (Expression a) where
70 succ = error "Enum.succ"
71 pred = error "Enum.pred"
72 toEnum = error "Enum.toEnum"
73 fromEnum = error "Enum.fromEnum"
74 enumFrom = error "Enum.enumFrom"
75 enumFromThen = error "Enum.enumFromThen"
76 enumFromTo = error "Enum.enumFromTo"
77 enumFromThenTo = error "Enum.enumFromThenTo"
78
79instance (Real a, Integral a, Floating a) => Real (Expression a) where
80 toRational = error "Real.toRational"
81
82instance (Ord a, Integral a, Floating a) => Ord (Expression a) where
83 compare = error "Ord.compare"
84 (<) = error "Ord.(<)"
85 (>=) = error "Ord.(>=)"
86 (>) = error "Ord.(>)"
87 (<=) = error "Ord.(<=)"
88 max = error "Ord.max"
89 min = error "Ord.min"
90
91instance (Integral a, Floating a) => Floating (Expression a) where
92 pi = error "Floating.pi"
93 exp = error "Floating.exp"
94 sqrt = error "Floating.sqrt"
95 log = error "Floating.log"
96 (**) = error "Floating.(**)"
97 logBase = error "Floating.logBase"
98 sin = error "Floating.sin"
99 tan = error "Floating.tan"
100 cos = error "Floating.cos"
101 asin = error "Floating.asin"
102 atan = error "Floating.atan"
103 acos = error "Floating.acos"
104 sinh = error "Floating.sinh"
105 tanh = error "Floating.tanh"
106 cosh = error "Floating.cosh"
107 asinh = error "Floating.asinh"
108 atanh = error "Floating.atanh"
109 acosh = error "Floating.acosh"
110
111instance (Integral a, Floating a) => Integral (Expression a) where
112 quot = error "Integral.quot"
113 rem = error "Integral.rem"
114 div = error "Integral.div"
115 mod = error "Integral.mod"
116 quotRem = error "Integral.quotRem"
117 divMod = error "Integral.divMod"
118 toInteger = error "Integral.toInteger"
119
120instance Integral Float where
121 quot = error "Integral.quot (Float)"
122 rem = error "Integral.rem (Float)"
123 div = error "Integral.div (Float)"
124 mod = error "Integral.mod (Float)"
125 quotRem = error "Integral.quotRem (Float)"
126 divMod = error "Integral.divMod (Float)"
127 toInteger = error "Integral.toInteger (Float)"
128
129instance (Fractional a, Integral a, Floating a) => Fractional (Expression a) where
130 (/) = error "Fractional.(/)"
131 recip = error "Fractional.recip"
132 fromRational = error "Fractional.fromRational"
133
134instance (Integral a, Floating a, RealFrac a) => RealFrac (Expression a) where
135 properFraction = error "RealFrac.properFraction"
136 truncate = error "RealFrac.truncate"
137 round = error "RealFrac.round"
138 ceiling = error "RealFrac.ceiling"
139 floor = error "RealFrac.floor"
140
141instance (Integral a, RealFloat a) => RealFloat (Expression a) where
142 floatRadix = error "RealFloat.floatRadix"
143 floatDigits = error "RealFloat.floatDigits"
144 floatRange = error "RealFloat.floatRange"
145 decodeFloat = error "RealFloat.decodeFloat"
146 encodeFloat = error "RealFloat.encodeFloat"
147 exponent = error "RealFloat.exponent"
148 significand = error "RealFloat.significand"
149 scaleFloat = error "RealFloat.scaleFloat"
150 isNaN = error "RealFloat.isNaN"
151 isInfinite = error "RealFloat.isInfinite"
152 isDenormalized = error "RealFloat.isDenormalized"
153 isNegativeZero = error "RealFloat.isNegativeZero"
154 isIEEE = error "RealFloat.isIEEE"
155 atan2 = error "RealFloat.atan2"
156
157instance (Show a, Eq a, Floating a) => Show (Expression a) where
158 show _ = ""
159
160{-[ КОНЕЦ МОДУЛЯ ]-------------------------------------------------------------}