module I1M.Pol
( Polinomio,
polCero,
esPolCero,
consPol,
grado,
coefLider,
restoPol
) where
data Polinomio a = PolCero
| ConsPol Int a (Polinomio a)
deriving Polinomio a -> Polinomio a -> Bool
(Polinomio a -> Polinomio a -> Bool)
-> (Polinomio a -> Polinomio a -> Bool) -> Eq (Polinomio a)
forall a. Eq a => Polinomio a -> Polinomio a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Polinomio a -> Polinomio a -> Bool
== :: Polinomio a -> Polinomio a -> Bool
$c/= :: forall a. Eq a => Polinomio a -> Polinomio a -> Bool
/= :: Polinomio a -> Polinomio a -> Bool
Eq
instance (Num a, Show a, Eq a) => Show (Polinomio a) where
show :: Polinomio a -> String
show Polinomio a
PolCero = String
"0"
show (ConsPol Int
0 a
b Polinomio a
PolCero) = a -> String
forall a. Show a => a -> String
show a
b
show (ConsPol Int
0 a
b Polinomio a
p) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [a -> String
forall a. Show a => a -> String
show a
b, String
" + ", Polinomio a -> String
forall a. Show a => a -> String
show Polinomio a
p]
show (ConsPol Int
1 a
b Polinomio a
PolCero) = a -> String
forall a. Show a => a -> String
show a
b String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"*x"
show (ConsPol Int
1 a
b Polinomio a
p) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [a -> String
forall a. Show a => a -> String
show a
b, String
"*x + ", Polinomio a -> String
forall a. Show a => a -> String
show Polinomio a
p]
show (ConsPol Int
n a
1 Polinomio a
PolCero) = String
"x^" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n
show (ConsPol Int
n a
b Polinomio a
PolCero) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [a -> String
forall a. Show a => a -> String
show a
b, String
"*x^", Int -> String
forall a. Show a => a -> String
show Int
n]
show (ConsPol Int
n a
1 Polinomio a
p) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String
"x^", Int -> String
forall a. Show a => a -> String
show Int
n, String
" + ", Polinomio a -> String
forall a. Show a => a -> String
show Polinomio a
p]
show (ConsPol Int
n a
b Polinomio a
p) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [a -> String
forall a. Show a => a -> String
show a
b, String
"*x^", Int -> String
forall a. Show a => a -> String
show Int
n, String
" + ", Polinomio a -> String
forall a. Show a => a -> String
show Polinomio a
p]
polCero :: Polinomio a
polCero :: forall a. Polinomio a
polCero = Polinomio a
forall a. Polinomio a
PolCero
esPolCero :: Polinomio a -> Bool
esPolCero :: forall a. Polinomio a -> Bool
esPolCero Polinomio a
PolCero = Bool
True
esPolCero Polinomio a
_ = Bool
False
consPol :: (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol :: forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol Int
_ a
0 Polinomio a
p = Polinomio a
p
consPol Int
n a
b Polinomio a
PolCero = Int -> a -> Polinomio a -> Polinomio a
forall a. Int -> a -> Polinomio a -> Polinomio a
ConsPol Int
n a
b Polinomio a
forall a. Polinomio a
PolCero
consPol Int
n a
b (ConsPol Int
m a
c Polinomio a
p)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
m = Int -> a -> Polinomio a -> Polinomio a
forall a. Int -> a -> Polinomio a -> Polinomio a
ConsPol Int
n a
b (Int -> a -> Polinomio a -> Polinomio a
forall a. Int -> a -> Polinomio a -> Polinomio a
ConsPol Int
m a
c Polinomio a
p)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
m = Int -> a -> Polinomio a -> Polinomio a
forall a. Int -> a -> Polinomio a -> Polinomio a
ConsPol Int
m a
c (Int -> a -> Polinomio a -> Polinomio a
forall a. (Num a, Eq a) => Int -> a -> Polinomio a -> Polinomio a
consPol Int
n a
b Polinomio a
p)
| a
ba -> a -> a
forall a. Num a => a -> a -> a
+a
c a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 = Polinomio a
p
| Bool
otherwise = Int -> a -> Polinomio a -> Polinomio a
forall a. Int -> a -> Polinomio a -> Polinomio a
ConsPol Int
n (a
ba -> a -> a
forall a. Num a => a -> a -> a
+a
c) Polinomio a
p
grado :: Polinomio a -> Int
grado :: forall a. Polinomio a -> Int
grado Polinomio a
PolCero = Int
0
grado (ConsPol Int
n a
_ Polinomio a
_) = Int
n
coefLider :: Num t => Polinomio t -> t
coefLider :: forall t. Num t => Polinomio t -> t
coefLider Polinomio t
PolCero = t
0
coefLider (ConsPol Int
_ t
b Polinomio t
_) = t
b
restoPol :: Polinomio t -> Polinomio t
restoPol :: forall t. Polinomio t -> Polinomio t
restoPol Polinomio t
PolCero = Polinomio t
forall a. Polinomio a
PolCero
restoPol (ConsPol Int
_ t
_ Polinomio t
p) = Polinomio t
p