Guest User

Untitled

a guest
Jan 21st, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE FlexibleInstances #-}
  2.  
  3. module Main (
  4.     main
  5. ) where
  6.  
  7. import Data.List
  8.  
  9. -- Алгебраическая структура Кольцо
  10. class Ring a where
  11.     add ∷ a → a → a -- (+)
  12.     mul ∷ a → a → a -- (*)
  13.     neg ∷ a → a     -- -x
  14.     idPlus ∷ () → a -- (+) identity
  15.     idMul ∷ () → a  -- (*) identity
  16.  
  17.     minus ∷ a → a → a
  18.     -- x - y = x + (-y)
  19.     minus x y = add x (neg y)
  20.  
  21. -- Задаём кольцо из целых чисел (underlying set = Z)
  22. -- С бинарными операциями + и *
  23. instance Ring Int where
  24.      add = (+)
  25.      mul = (*)
  26.      neg x = -x
  27.      idPlus () = 0
  28.      idMul () = 1
  29.  
  30. -- Аналогичное кольцо из рациональных чисел
  31. instance Ring Float where
  32.      add = (+)
  33.      mul = (*)
  34.      neg x = -x
  35.      idPlus () = 0.0
  36.      idMul () = 1.0
  37.  
  38. -- Матрица из элементов кольца
  39. -- Можно добавить | Zero и | One для умножения и сложения
  40. newtype Matrix a = Matrix [[a]]
  41.     deriving Show
  42.  
  43. linearize ∷ Matrix a → [a]
  44. linearize (Matrix list) = foldl' (λ state elem → state ⊕ elem) [] list
  45.  
  46. -- Выполнить операцию op над всеми элементами матриц попарно
  47. mPerformOp ∷ (Ring a) ⇒ (a → a → a) → Matrix a → Matrix a → Matrix a
  48. mPerformOp op (Matrix a) (Matrix b) =
  49.    Matrix result
  50.    where
  51.        helper [] _ = []
  52.        helper _ [] = []
  53.        helper (x : xs) (y : ys) = (zipWith op x y) : (helper xs ys)
  54.        result = helper a b
  55.  
  56. -- Сложение матриц
  57. mAdd ∷(Ring a) ⇒ Matrix a → Matrix a → Matrix a
  58. mAdd = mPerformOp add
  59.  
  60. -- Вычитание матриц
  61. mSub ∷(Ring a) ⇒ Matrix a → Matrix a → Matrix a
  62. mSub = mPerformOp minus
  63.  
  64. -- Умножение на скаляр - матрица * скаляр
  65. mMulR ∷ (Ring a) ⇒ Matrix a → a → Matrix a
  66. mMulR (Matrix []) _ = Matrix []
  67. mMulR (Matrix m) scalar =
  68.    Matrix result
  69.    where
  70.        helper [] = []
  71.        helper (x:xs) =  map (λ elem → mul elem scalar) x : helper xs
  72.        result = helper m
  73.  
  74. -- скаляр * матрицу
  75. mMulL ∷ (Ring a) ⇒ a → Matrix a → Matrix a
  76. mMulL _ (Matrix []) = Matrix []
  77. mMulL scalar (Matrix m) =
  78.    Matrix result
  79.    where
  80.        helper [] = []
  81.        helper (x:xs) =  map (λ elem → mul scalar elem) x : helper xs
  82.        result = helper m
  83.  
  84. -- (- Матрица)
  85. mNeg ∷ (Ring a) ⇒ Matrix a → Matrix a
  86. mNeg (Matrix []) = Matrix []
  87. mNeg (Matrix m) =
  88.    Matrix result
  89.    where
  90.        helper [] = []
  91.        helper (x:xs) =  map (λ elem → neg elem) x : helper xs
  92.        result = helper m
  93.  
  94. -- Транспозиция
  95. mTranspose ∷  (Ring a) ⇒ Matrix a → Matrix a
  96. mTranspose (Matrix m) = Matrix (transpose m)
  97.  
  98. summator ∷ (Ring a) ⇒ [a] → a
  99. summator list = foldl' add (idPlus()) list
  100.  
  101. -- Умножение матриц
  102. mMul ∷ (Ring a) ⇒ Matrix a → Matrix a → Matrix a
  103. mMul (Matrix aM) (Matrix bM) =  
  104.     Matrix [ [summator $ zipWith mul a b | b ← transpose bM ] | a ← aM ]
  105.  
  106. -- Нулевая матрица
  107. mZero ∷ (Ring a)() → Matrix a
  108. mZero () = Matrix [[ idPlus() ]]
  109.  
  110. -- Единичная матрица
  111. mOne ∷ (Ring a)() → Matrix a
  112. mOne () = Matrix [[ idMul() ]]
  113.  
  114.  
  115. -- Матрицы тоже образуют кольцо
  116. instance Ring a ⇒ Ring (Matrix a) where
  117.     add = mAdd
  118.     mul = mMul
  119.     neg = mNeg
  120.     idPlus = mZero
  121.     idMul = mOne
  122.  
  123. -- Выражение в кольце
  124. data (Ring a) ⇒ Expression a =
  125.     Element a
  126.     | Plus (Expression a) (Expression a)
  127.     | Minus (Expression a) (Expression a)
  128.     | Negate (Expression a)
  129.     | Mul (Expression a) (Expression a)
  130.     | Zero
  131.     | One
  132.     deriving Show
  133.  
  134. -- Функция, вычисляющая значение выражения
  135. calc ∷ (Ring a) ⇒ Expression a → a
  136. calc (Element x) = x
  137. calc (Plus e1 e2) = add (calc e1) (calc e2)
  138. calc (Minus e1 e2) = minus (calc e1) (calc e2)
  139. calc (Negate e1) = neg (calc e1)
  140. calc (Mul e1 e2) = mul (calc e1) (calc e2)
  141. calc Zero = idPlus ()
  142. calc One = idMul ()
  143.  
  144.  
  145. -- Тестовые данные
  146. a_m = Matrix [[1, 3], [2, 4], [0, 5]] ∷ Matrix Int
  147. b_m = Matrix [[1, 0], [2, 3]]
  148. i_m = Matrix [[1, 0, 0, 1], [0, 1, 0, 1]]
  149.  
  150. megaMatrix = Matrix [[ a_m, b_m, a_m], [i_m, a_m, b_m]]
  151.  
  152. test = mMul a_m b_m
  153. test2 = mMul test i_m
  154.  
  155. -- Выражения
  156. e = Negate (Mul (Element a_m) (Element b_m))
  157. e1 = Mul (Plus One (One ∷ Expression Float)) One
  158.  
  159. main =
  160.     do
  161.         putStrLn "Hello World!"
  162.         putStrLn $ show test
  163.         putStrLn $ show test2
  164.         putStrLn $ show $ megaMatrix
  165.         putStrLn $ show $ mMulR megaMatrix a_m
  166.         putStrLn $ show $ mNeg megaMatrix
  167.         putStrLn $ show $ calc e
  168.         putStrLn $ show $ calc e1
Add Comment
Please, Sign In to add comment