Другие языки программирования и технологии

Haskell, Комплексные числа

Задание такое: Напишите функции, моделирующие операции сложения и умножения над КОМПЛЕКСНЫМИ ЧИСЛАМИ.
Во-первых, объясните как работают комплексные числа в Хаскел.
А второе подробно решить задачу, с объянениями.
Спасибо, я только познаю этот язык
Так, а чем готовый пакет не устраивает?
 import Data.Complex

x = 1 :+ 3
y = 1 :+ (-3)

main = putStrLn $ show $ x * y
Напечатает
 10 :+ 0 
(т.е. произведение комплексно-сопряжённых чисел 1 + 3i и 1 - 3i даст вещественное число 10 с нулевой мнимой частью)

Описано тут:
https://hackage.haskell.org/package/base-4.18.0.0/docs/Data-Complex.html

Как видим, он реализует пару десятков классов типов, так что с нуля всё это повторять, да ещё не имея опыта, - весёлая будет неделька, если не месяц.

Если всё же приспичило реализовать свой Complex, с сопряжением и монадами, то хотя бы опирайся на существующую реализацию, вот исходники:
https://hackage.haskell.org/package/base-4.18.0.0/docs/src/Data.Complex.html#Complex

Допустим, арифметика:
 instance  (RealFloat a) => Num (Complex a)  where
(x:+y) + (x':+y') = (x+x') :+ (y+y')
(x:+y) - (x':+y') = (x-x') :+ (y-y')
(x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x')
negate (x:+y) = negate x :+ negate y
abs z = magnitude z :+ 0
signum (0:+0) = 0
signum z@(x:+y) = x/r :+ y/r where r = magnitude z
fromInteger n = fromInteger n :+ 0
Это - комплексные числа на базовом числовом типе (дальше есть специализация на рациональных дробях).
Определяются (в порядке следования в коде) операции сложения, вычитания, умножения двух чисел, изменения знака на противоположный, взятие абсолютной величины (т.е. модуля), знака (т.е. угла поворота числа), конструктор из целого числа без мнимой части.
Например, сложение:
 (x:+y) - паттерн первого операнда
+ - сама функция (инфиксная, т.е. синтаксически находится между первым операндом и остальными)
(x':+y') - паттерн второго операнда

:+ - конструктор комплексного числа, также инфиксный
Благодаря паттернам, в определении функции сразу доступны вещественная и мнимая части операндов (это называется деструктуризацией). Из них формируется новое комплексное число, вещественная часть которого равна сумме вещественных частей операндов, а мнимая - сумме мнимых.
x', y' - это идентификаторы. В идентификаторах Haskell можно свободно использовать пунктуацию. С x и y они никак не связаны, кроме похожих названий. В других языках пришлось бы называть их как-то вроде x1, y1 или u, v и т.п.
Александр Строкин
Александр Строкин
87 571
Лучший ответ
Кораков Сергей а что делать с умножением? если i*i = (-1)?