0xd34df00d
09.10.2011 13:01 Azoth_primary
Интересно как. Вот есть матрицы, например. Вот их можно там складывать, умножать очевидным образом. Делить можно (A/B = C <=> A = CB). Ну с negate еще понятно, наверное — умножить матрицу на скаляр (-1). abs можно каким-то раком ввести, хотя сходу неочевидно, как, норму шоле выбрать какую. signum — ну, тоже хуй пойми, что это такое. Знак детерминанта? Знакоопределенность матрицы? fromInteger — создать матрицу 1×1 из скаляра?
Не, хуйня какая-то. Не буду я делать матрицу инстансом Num'а.
делить можно *слева*, а можно и *справа*. Не забывай, ебена мать.
Че.
у матриц некоммутативное умножение и деление же. A/B для матриц может означать две разные вещи: AB¯¹ или B¯¹A.
Так, во-первых матрицы определённого размера можно рассматривать как Num, произвольного нельзя. И только квадратные. А fromInteger это E * n
Алсо ты хер, Num не требует деления.
class (Eq a, Show a) => Num a where
(+), (-), (*) :: a → a → a
— | Unary negation.
negate :: a → a
— | Absolute value.
abs :: a → a
— | Sign of a number.
— The functions 'abs' and 'signum' should satisfy the law:
--
— > abs x * signum x == x
--
— For real numbers, the 'signum' is either @-1@ (negative), @0@ (zero)
— or @1@ (positive).
signum :: a → a
— | Conversion from an 'Integer'.
— An integer literal represents the application of the function
— 'fromInteger' to the appropriate value of type 'Integer',
— so such literals have type @('Num' a) => a@.
fromInteger :: Integer → a
{-# INLINE (-) #-}
{-# INLINE negate #-}
x — y = x + negate y
negate x = 0 — x
Матрицы n x n легко сюда вписать. Разве что с signum сложновато.
Да не, тоже не сложно. Нужно только внимательно посмотреть на тип signum'а и abs:
abs :: a → a
signum :: a → a
Почему это только квадратные?
И что ты имеешь ввиду под определенным размером?
А, ну с этой точки зрения да.
ты не можешь складывать матрицы разного размера, например. Так что у тебя будет счётное количество полей из матриц разных размеров.
Потому что ты не можешь умножить две матрицы рандомных размеров. Num это кольцо, а матрицы сами по себе, — полугруппа.
Вот блядство.
А, ну да, точно. Чего-то я об этом как-то не подумал, все матрицы не образуют группу по сложению/умножению/чотам еще.
Бггг. Я бы завёл type class матричное пространство. Завёл бы sub type class матричное пространство конечных матриц, которое бы автоинстанировало Num.
*Завёл бы sub type class матричное пространство конечных квадратных матриц
FIXED
Мне квадратные матрицы нахуй не нужны. У меня чаще всего матрицы размерности n×n+1 (или -1, не помню) и n×1.
Ужас, кому-то нужны неквадратные матрицы :O
Ну ладно с векторами (n×1) ещё понятно, а зачем такое извращение как n×(n+1)?
Якобиан функции нескольких аргументов, ёбана!
А, матрица инцидентности, ебана! Вернее, там n+1×n.