Safe Haskell | Safe |
---|---|

Language | Haskell2010 |

## Synopsis

- data Complex a
- realPart :: Complex a -> a
- imagPart :: Complex a -> a
- mkPolar :: Floating a => a -> a -> Complex a
- cis :: Floating a => a -> Complex a
- polar :: RealFloat a => Complex a -> (a, a)
- magnitude :: RealFloat a => Complex a -> a
- phase :: RealFloat a => Complex a -> a
- conjugate :: Num a => Complex a -> Complex a
- _realPart :: Functor f => (a -> f a) -> Complex a -> f (Complex a)
- _imagPart :: Functor f => (a -> f a) -> Complex a -> f (Complex a)
- _polar :: RealFloat a => Iso' (Complex a) (a, a)
- _magnitude :: RealFloat a => Lens' (Complex a) a
- _phase :: RealFloat a => Lens' (Complex a) a
- _conjugate :: RealFloat a => Iso' (Complex a) (Complex a)

# Complex

Complex numbers are an algebraic type.

For a complex number `z`

,

is a number with the magnitude of `abs`

z`z`

,
but oriented in the positive real direction, whereas

has the phase of `signum`

z`z`

, but unit magnitude.

The `Foldable`

and `Traversable`

instances traverse the real part first.

## Instances

mkPolar :: Floating a => a -> a -> Complex a #

Form a complex number from polar components of magnitude and phase.

## Optics

_polar :: RealFloat a => Iso' (Complex a) (a, a) #

This isn't *quite* a legal `Lens`

. Notably the

`view`

l (`set`

l b a) = b

law is violated when you set a `polar`

value with 0 `magnitude`

and non-zero
`phase`

as the `phase`

information is lost, or with a negative `magnitude`

which flips the `phase`

and retains a positive `magnitude`

. So don't do
that!

Otherwise, this is a perfectly cromulent `Lens`

.

_magnitude :: RealFloat a => Lens' (Complex a) a #

Access the `magnitude`

of a `Complex`

number.

`>>>`

20.0 :+ 40.0`(10.0 :+ 20.0) & _magnitude *~ 2`

This isn't *quite* a legal `Lens`

. Notably the

`view`

l (`set`

l b a) = b

law is violated when you set a negative `magnitude`

. This flips the `phase`

and retains a positive `magnitude`

. So don't do that!

Otherwise, this is a perfectly cromulent `Lens`

.

Setting the `magnitude`

of a zero `Complex`

number assumes the `phase`

is 0.

_phase :: RealFloat a => Lens' (Complex a) a #

Access the `phase`

of a `Complex`

number.

`>>>`

True`(mkPolar 10 (2-pi) & _phase +~ pi & view _phase) ≈ 2`

This isn't *quite* a legal `Lens`

. Notably the

`view`

l (`set`

l b a) = b

law is violated when you set a `phase`

outside the range `(-`

.
The phase is always in that range when queried. So don't do that!`pi`

, `pi`

]

Otherwise, this is a perfectly cromulent `Lens`

.