Задание такое: Напишите функции, моделирующие операции сложения и умножения над КОМПЛЕКСНЫМИ ЧИСЛАМИ.
Во-первых, объясните как работают комплексные числа в Хаскел.
А второе подробно решить задачу, с объянениями.
Спасибо, я только познаю этот язык
Другие языки программирования и технологии
Haskell, Комплексные числа
Так, а чем готовый пакет не устраивает?
Описано тут:
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
Допустим, арифметика:
Определяются (в порядке следования в коде) операции сложения, вычитания, умножения двух чисел, изменения знака на противоположный, взятие абсолютной величины (т.е. модуля), знака (т.е. угла поворота числа), конструктор из целого числа без мнимой части.
Например, сложение:
x', y' - это идентификаторы. В идентификаторах Haskell можно свободно использовать пунктуацию. С x и y они никак не связаны, кроме похожих названий. В других языках пришлось бы называть их как-то вроде x1, y1 или u, v и т.п.
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 и т.п.
Кораков Сергей
а что делать с умножением? если i*i = (-1)?
Похожие вопросы
- Quot что такое? Haskell
- как вы относитесь к функциональному программированию, в часности к языку Haskell&
- Подскажите где найти типовую комплексную конфигурацию 1с 7.7 релиз 7.70.460?
- Генератор Случайных Чисел
- Как написать программу, которая будет представлять вещественное число в памяти компьютера
- помогите решить задачи на паскале 1Во входном файле дана последовательность чисел. Требуется найти второе по величине чи
- При делении отрицательного числа выводит не правильный ответ (assembler). Если беру числа 127 13 10, пишет переполнение
- помогите решить задачу Во входном файле дана последовательность чисел , число (количество чисел в после
- аскаль. Написать программу которая переводит число из одной системы счисления в другую
- Узнать сколько знаков после запятой в числе? Visual Basic