Вы можете написать instance Num Vector
для перегрузки +
для сложения векторов (и других операторов, которые имеют смысл).
instance Num Vector where
(Vector x1 y1) + (Vector x2 y2) = Vector (x1 + x2) (y1 + y2)
-- and so on
Однако обратите внимание, что +
имеет тип Num a => a -> a -> a
т.е. оба операнда и результат должны быть одного типа.Это означает, что вы не можете иметь Dot
плюс Vector
быть Dot
.
Хотя вы можете скрыть Num
от Prelude
и указать свой собственный +
, это скорее всеговызвать путаницу и затруднить использование вашего кода вместе с обычной арифметикой.
Я предлагаю вам определить свой собственный оператор для сложения векторной точки, например,
(Dot x y) `offsetBy` (Vector dx dy) = Dot (x + dx) (y + dy)
или другой вариант с использованием символов, если вы предпочитаете что-то более короткое.