{-# LANGUAGE DeriveDataTypeable #-}{-# LANGUAGE Trustworthy #-}{-# LANGUAGE StandaloneDeriving #-}{-# LANGUAGE DeriveGeneric #-}{-# LANGUAGE DeriveTraversable #-}------------------------------------------------------------------------------- |-- Module : Data.Complex-- Copyright : (c) The University of Glasgow 2001-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : provisional-- Portability : portable---- Complex numbers.-------------------------------------------------------------------------------moduleData.Complex(-- * Rectangular formComplex ((:+) ),realPart ,imagPart -- * Polar form,mkPolar ,cis ,polar ,magnitude ,phase -- * Conjugate,conjugate )whereimportGHC.Base (Applicative (..))importGHC.Generics (Generic ,Generic1 )importGHC.Float (Floating (..))importData.Data (Data )importForeign (Storable ,castPtr ,peek ,poke ,pokeElemOff ,peekElemOff ,sizeOf ,alignment )infix6:+ -- ------------------------------------------------------------------------------- The Complex type-- | Complex numbers are an algebraic type.---- For a complex number @z@, @'abs' z@ is a number with the magnitude of @z@,-- but oriented in the positive real direction, whereas @'signum' z@-- has the phase of @z@, but unit magnitude.---- The 'Foldable' and 'Traversable' instances traverse the real part first.---- Note that `Complex`'s instances inherit the deficiencies from the type-- parameter's. For example, @Complex Float@'s 'Ord' instance has similar-- problems to `Float`'s.dataComplex a =!a :+ !a -- ^ forms a complex number from its real and imaginary-- rectangular components.deriving(Eq-- ^ @since 2.01,Show -- ^ @since 2.01,Read -- ^ @since 2.01,Data -- ^ @since 2.01,Generic -- ^ @since 4.9.0.0,Generic1 -- ^ @since 4.9.0.0,Functor -- ^ @since 4.9.0.0,Foldable -- ^ @since 4.9.0.0,Traversable -- ^ @since 4.9.0.0)-- ------------------------------------------------------------------------------- Functions over Complex-- | Extracts the real part of a complex number.realPart ::Complex a ->a realPart :: Complex a -> a realPart (x :: a x :+ _)=a x -- | Extracts the imaginary part of a complex number.imagPart ::Complex a ->a imagPart :: Complex a -> a imagPart (_:+ y :: a y )=a y -- | The conjugate of a complex number.{-# SPECIALISEconjugate ::Complex Double->Complex Double#-}conjugate ::Num a =>Complex a ->Complex a conjugate :: Complex a -> Complex a conjugate (x :: a x :+ y :: a y )=a x a -> a -> Complex a forall a. a -> a -> Complex a :+ (-a y )-- | Form a complex number from polar components of magnitude and phase.{-# SPECIALISEmkPolar ::Double->Double->Complex Double#-}mkPolar ::Floating a =>a ->a ->Complex a mkPolar :: a -> a -> Complex a mkPolar r :: a r theta :: a theta =a r a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a cos a theta a -> a -> Complex a forall a. a -> a -> Complex a :+ a r a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a sin a theta -- | @'cis' t@ is a complex value with magnitude @1@-- and phase @t@ (modulo @2*'pi'@).{-# SPECIALISEcis ::Double->Complex Double#-}cis ::Floating a =>a ->Complex a cis :: a -> Complex a cis theta :: a theta =a -> a forall a. Floating a => a -> a cos a theta a -> a -> Complex a forall a. a -> a -> Complex a :+ a -> a forall a. Floating a => a -> a sin a theta -- | The function 'polar' takes a complex number and-- returns a (magnitude, phase) pair in canonical form:-- the magnitude is nonnegative, and the phase in the range @(-'pi', 'pi']@;-- if the magnitude is zero, then so is the phase.{-# SPECIALISEpolar ::Complex Double->(Double,Double)#-}polar ::(RealFloat a )=>Complex a ->(a ,a )polar :: Complex a -> (a, a) polar z :: Complex a z =(Complex a -> a forall a. RealFloat a => Complex a -> a magnitude Complex a z ,Complex a -> a forall a. RealFloat a => Complex a -> a phase Complex a z )-- | The nonnegative magnitude of a complex number.{-# SPECIALISEmagnitude ::Complex Double->Double#-}magnitude ::(RealFloat a )=>Complex a ->a magnitude :: Complex a -> a magnitude (x :: a x :+ y :: a y )=Int -> a -> a forall a. RealFloat a => Int -> a -> a scaleFloat Int k (a -> a forall a. Floating a => a -> a sqrt (a -> a forall a. Num a => a -> a sqr (Int -> a -> a forall a. RealFloat a => Int -> a -> a scaleFloat Int mk a x )a -> a -> a forall a. Num a => a -> a -> a + a -> a forall a. Num a => a -> a sqr (Int -> a -> a forall a. RealFloat a => Int -> a -> a scaleFloat Int mk a y )))wherek :: Int k =Int -> Int -> Int forall a. Ord a => a -> a -> a max(a -> Int forall a. RealFloat a => a -> Int exponent a x )(a -> Int forall a. RealFloat a => a -> Int exponent a y )mk :: Int mk =-Int k sqr :: a -> a sqr z :: a z =a z a -> a -> a forall a. Num a => a -> a -> a * a z -- | The phase of a complex number, in the range @(-'pi', 'pi']@.-- If the magnitude is zero, then so is the phase.{-# SPECIALISEphase ::Complex Double->Double#-}phase ::(RealFloat a )=>Complex a ->a phase :: Complex a -> a phase (0:+ 0)=0-- SLPJ July 97 from John Petersonphase (x :: a x :+ y :: a y )=a -> a -> a forall a. RealFloat a => a -> a -> a atan2 a y a x -- ------------------------------------------------------------------------------- Instances of Complex-- | @since 2.01instance(RealFloat a )=>Num (Complex a )where{-# SPECIALISEinstanceNum (Complex Float)#-}{-# SPECIALISEinstanceNum (Complex Double)#-}(x :: a x :+ y :: a y )+ :: Complex a -> Complex a -> Complex a + (x' :: a x' :+ y' :: a y' )=(a x a -> a -> a forall a. Num a => a -> a -> a + a x' )a -> a -> Complex a forall a. a -> a -> Complex a :+ (a y a -> a -> a forall a. Num a => a -> a -> a + a y' )(x :: a x :+ y :: a y )- :: Complex a -> Complex a -> Complex a - (x' :: a x' :+ y' :: a y' )=(a x a -> a -> a forall a. Num a => a -> a -> a - a x' )a -> a -> Complex a forall a. a -> a -> Complex a :+ (a y a -> a -> a forall a. Num a => a -> a -> a - a y' )(x :: a x :+ y :: a y )* :: Complex a -> Complex a -> Complex a * (x' :: a x' :+ y' :: a y' )=(a x a -> a -> a forall a. Num a => a -> a -> a * a x' a -> a -> a forall a. Num a => a -> a -> a - a y a -> a -> a forall a. Num a => a -> a -> a * a y' )a -> a -> Complex a forall a. a -> a -> Complex a :+ (a x a -> a -> a forall a. Num a => a -> a -> a * a y' a -> a -> a forall a. Num a => a -> a -> a + a y a -> a -> a forall a. Num a => a -> a -> a * a x' )negate :: Complex a -> Complex a negate (x :: a x :+ y :: a y )=a -> a forall a. Num a => a -> a negate a x a -> a -> Complex a forall a. a -> a -> Complex a :+ a -> a forall a. Num a => a -> a negate a y abs :: Complex a -> Complex a abs z :: Complex a z =Complex a -> a forall a. RealFloat a => Complex a -> a magnitude Complex a z a -> a -> Complex a forall a. a -> a -> Complex a :+ 0signum :: Complex a -> Complex a signum (0:+ 0)=0signum z :: Complex a z @(x :: a x :+ y :: a y )=a x a -> a -> a forall a. Fractional a => a -> a -> a / a r a -> a -> Complex a forall a. a -> a -> Complex a :+ a y a -> a -> a forall a. Fractional a => a -> a -> a / a r wherer :: a r =Complex a -> a forall a. RealFloat a => Complex a -> a magnitude Complex a z fromInteger :: Integer -> Complex a fromInteger n :: Integer n =Integer -> a forall a. Num a => Integer -> a fromInteger Integer n a -> a -> Complex a forall a. a -> a -> Complex a :+ 0-- | @since 2.01instance(RealFloat a )=>Fractional (Complex a )where{-# SPECIALISEinstanceFractional (Complex Float)#-}{-# SPECIALISEinstanceFractional (Complex Double)#-}(x :: a x :+ y :: a y )/ :: Complex a -> Complex a -> Complex a / (x' :: a x' :+ y' :: a y' )=(a x a -> a -> a forall a. Num a => a -> a -> a * a x'' a -> a -> a forall a. Num a => a -> a -> a + a y a -> a -> a forall a. Num a => a -> a -> a * a y'' )a -> a -> a forall a. Fractional a => a -> a -> a / a d a -> a -> Complex a forall a. a -> a -> Complex a :+ (a y a -> a -> a forall a. Num a => a -> a -> a * a x'' a -> a -> a forall a. Num a => a -> a -> a - a x a -> a -> a forall a. Num a => a -> a -> a * a y'' )a -> a -> a forall a. Fractional a => a -> a -> a / a d wherex'' :: a x'' =Int -> a -> a forall a. RealFloat a => Int -> a -> a scaleFloat Int k a x' y'' :: a y'' =Int -> a -> a forall a. RealFloat a => Int -> a -> a scaleFloat Int k a y' k :: Int k =-Int -> Int -> Int forall a. Ord a => a -> a -> a max(a -> Int forall a. RealFloat a => a -> Int exponent a x' )(a -> Int forall a. RealFloat a => a -> Int exponent a y' )d :: a d =a x' a -> a -> a forall a. Num a => a -> a -> a * a x'' a -> a -> a forall a. Num a => a -> a -> a + a y' a -> a -> a forall a. Num a => a -> a -> a * a y'' fromRational :: Rational -> Complex a fromRational a :: Rational a =Rational -> a forall a. Fractional a => Rational -> a fromRational Rational a a -> a -> Complex a forall a. a -> a -> Complex a :+ 0-- | @since 2.01instance(RealFloat a )=>Floating (Complex a )where{-# SPECIALISEinstanceFloating (Complex Float)#-}{-# SPECIALISEinstanceFloating (Complex Double)#-}pi :: Complex a pi =a forall a. Floating a => a pi a -> a -> Complex a forall a. a -> a -> Complex a :+ 0exp :: Complex a -> Complex a exp (x :: a x :+ y :: a y )=a expx a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a cos a y a -> a -> Complex a forall a. a -> a -> Complex a :+ a expx a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a sin a y whereexpx :: a expx =a -> a forall a. Floating a => a -> a exp a x log :: Complex a -> Complex a log z :: Complex a z =a -> a forall a. Floating a => a -> a log (Complex a -> a forall a. RealFloat a => Complex a -> a magnitude Complex a z )a -> a -> Complex a forall a. a -> a -> Complex a :+ Complex a -> a forall a. RealFloat a => Complex a -> a phase Complex a z x :: Complex a x ** :: Complex a -> Complex a -> Complex a ** y :: Complex a y =case(Complex a x ,Complex a y )of(_,(0:+ 0))->1a -> a -> Complex a forall a. a -> a -> Complex a :+ 0((0:+ 0),(exp_re :: a exp_re :+ _))->casea -> a -> Ordering forall a. Ord a => a -> a -> Ordering comparea exp_re 0ofGT->0a -> a -> Complex a forall a. a -> a -> Complex a :+ 0LT->a inf a -> a -> Complex a forall a. a -> a -> Complex a :+ 0EQ->a nan a -> a -> Complex a forall a. a -> a -> Complex a :+ a nan ((re :: a re :+ im :: a im ),(exp_re :: a exp_re :+ _))|(a -> Bool forall a. RealFloat a => a -> Bool isInfinite a re Bool -> Bool -> Bool ||a -> Bool forall a. RealFloat a => a -> Bool isInfinite a im )->casea -> a -> Ordering forall a. Ord a => a -> a -> Ordering comparea exp_re 0ofGT->a inf a -> a -> Complex a forall a. a -> a -> Complex a :+ 0LT->0a -> a -> Complex a forall a. a -> a -> Complex a :+ 0EQ->a nan a -> a -> Complex a forall a. a -> a -> Complex a :+ a nan |Bool otherwise ->Complex a -> Complex a forall a. Floating a => a -> a exp (Complex a -> Complex a forall a. Floating a => a -> a log Complex a x Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a * Complex a y )whereinf :: a inf =1a -> a -> a forall a. Fractional a => a -> a -> a / 0nan :: a nan =0a -> a -> a forall a. Fractional a => a -> a -> a / 0sqrt :: Complex a -> Complex a sqrt (0:+ 0)=0sqrt z :: Complex a z @(x :: a x :+ y :: a y )=a u a -> a -> Complex a forall a. a -> a -> Complex a :+ (ifa y a -> a -> Bool forall a. Ord a => a -> a -> Bool <0then-a v elsea v )where(u :: a u ,v :: a v )=ifa x a -> a -> Bool forall a. Ord a => a -> a -> Bool <0then(a v' ,a u' )else(a u' ,a v' )v' :: a v' =a -> a forall a. Num a => a -> a abs a y a -> a -> a forall a. Fractional a => a -> a -> a / (a u' a -> a -> a forall a. Num a => a -> a -> a * 2)u' :: a u' =a -> a forall a. Floating a => a -> a sqrt ((Complex a -> a forall a. RealFloat a => Complex a -> a magnitude Complex a z a -> a -> a forall a. Num a => a -> a -> a + a -> a forall a. Num a => a -> a abs a x )a -> a -> a forall a. Fractional a => a -> a -> a / 2)sin :: Complex a -> Complex a sin (x :: a x :+ y :: a y )=a -> a forall a. Floating a => a -> a sin a x a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a cosh a y a -> a -> Complex a forall a. a -> a -> Complex a :+ a -> a forall a. Floating a => a -> a cos a x a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a sinh a y cos :: Complex a -> Complex a cos (x :: a x :+ y :: a y )=a -> a forall a. Floating a => a -> a cos a x a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a cosh a y a -> a -> Complex a forall a. a -> a -> Complex a :+ (-a -> a forall a. Floating a => a -> a sin a x a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a sinh a y )tan :: Complex a -> Complex a tan (x :: a x :+ y :: a y )=(a sinx a -> a -> a forall a. Num a => a -> a -> a * a coshy a -> a -> Complex a forall a. a -> a -> Complex a :+ a cosx a -> a -> a forall a. Num a => a -> a -> a * a sinhy )Complex a -> Complex a -> Complex a forall a. Fractional a => a -> a -> a / (a cosx a -> a -> a forall a. Num a => a -> a -> a * a coshy a -> a -> Complex a forall a. a -> a -> Complex a :+ (-a sinx a -> a -> a forall a. Num a => a -> a -> a * a sinhy ))wheresinx :: a sinx =a -> a forall a. Floating a => a -> a sin a x cosx :: a cosx =a -> a forall a. Floating a => a -> a cos a x sinhy :: a sinhy =a -> a forall a. Floating a => a -> a sinh a y coshy :: a coshy =a -> a forall a. Floating a => a -> a cosh a y sinh :: Complex a -> Complex a sinh (x :: a x :+ y :: a y )=a -> a forall a. Floating a => a -> a cos a y a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a sinh a x a -> a -> Complex a forall a. a -> a -> Complex a :+ a -> a forall a. Floating a => a -> a sin a y a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a cosh a x cosh :: Complex a -> Complex a cosh (x :: a x :+ y :: a y )=a -> a forall a. Floating a => a -> a cos a y a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a cosh a x a -> a -> Complex a forall a. a -> a -> Complex a :+ a -> a forall a. Floating a => a -> a sin a y a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a sinh a x tanh :: Complex a -> Complex a tanh (x :: a x :+ y :: a y )=(a cosy a -> a -> a forall a. Num a => a -> a -> a * a sinhx a -> a -> Complex a forall a. a -> a -> Complex a :+ a siny a -> a -> a forall a. Num a => a -> a -> a * a coshx )Complex a -> Complex a -> Complex a forall a. Fractional a => a -> a -> a / (a cosy a -> a -> a forall a. Num a => a -> a -> a * a coshx a -> a -> Complex a forall a. a -> a -> Complex a :+ a siny a -> a -> a forall a. Num a => a -> a -> a * a sinhx )wheresiny :: a siny =a -> a forall a. Floating a => a -> a sin a y cosy :: a cosy =a -> a forall a. Floating a => a -> a cos a y sinhx :: a sinhx =a -> a forall a. Floating a => a -> a sinh a x coshx :: a coshx =a -> a forall a. Floating a => a -> a cosh a x asin :: Complex a -> Complex a asin z :: Complex a z @(x :: a x :+ y :: a y )=a y' a -> a -> Complex a forall a. a -> a -> Complex a :+ (-a x' )where(x' :: a x' :+ y' :: a y' )=Complex a -> Complex a forall a. Floating a => a -> a log (((-a y )a -> a -> Complex a forall a. a -> a -> Complex a :+ a x )Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + Complex a -> Complex a forall a. Floating a => a -> a sqrt (1Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a - Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a * Complex a z ))acos :: Complex a -> Complex a acos z :: Complex a z =a y'' a -> a -> Complex a forall a. a -> a -> Complex a :+ (-a x'' )where(x'' :: a x'' :+ y'' :: a y'' )=Complex a -> Complex a forall a. Floating a => a -> a log (Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + ((-a y' )a -> a -> Complex a forall a. a -> a -> Complex a :+ a x' ))(x' :: a x' :+ y' :: a y' )=Complex a -> Complex a forall a. Floating a => a -> a sqrt (1Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a - Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a * Complex a z )atan :: Complex a -> Complex a atan z :: Complex a z @(x :: a x :+ y :: a y )=a y' a -> a -> Complex a forall a. a -> a -> Complex a :+ (-a x' )where(x' :: a x' :+ y' :: a y' )=Complex a -> Complex a forall a. Floating a => a -> a log (((1a -> a -> a forall a. Num a => a -> a -> a - a y )a -> a -> Complex a forall a. a -> a -> Complex a :+ a x )Complex a -> Complex a -> Complex a forall a. Fractional a => a -> a -> a / Complex a -> Complex a forall a. Floating a => a -> a sqrt (1Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a * Complex a z ))asinh :: Complex a -> Complex a asinh z :: Complex a z =Complex a -> Complex a forall a. Floating a => a -> a log (Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + Complex a -> Complex a forall a. Floating a => a -> a sqrt (1Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a * Complex a z ))-- Take care to allow (-1)::Complex, fixing #8532acosh :: Complex a -> Complex a acosh z :: Complex a z =Complex a -> Complex a forall a. Floating a => a -> a log (Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + (Complex a -> Complex a forall a. Floating a => a -> a sqrt (Complex a -> Complex a) -> Complex a -> Complex a forall a b. (a -> b) -> a -> b $ Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + 1)Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a * (Complex a -> Complex a forall a. Floating a => a -> a sqrt (Complex a -> Complex a) -> Complex a -> Complex a forall a b. (a -> b) -> a -> b $ Complex a z Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a - 1))atanh :: Complex a -> Complex a atanh z :: Complex a z =0.5Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a * Complex a -> Complex a forall a. Floating a => a -> a log ((1.0Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + Complex a z )Complex a -> Complex a -> Complex a forall a. Fractional a => a -> a -> a / (1.0Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a - Complex a z ))log1p :: Complex a -> Complex a log1p x :: Complex a x @(a :: a a :+ b :: a b )|a -> a forall a. Num a => a -> a abs a a a -> a -> Bool forall a. Ord a => a -> a -> Bool <0.5Bool -> Bool -> Bool &&a -> a forall a. Num a => a -> a abs a b a -> a -> Bool forall a. Ord a => a -> a -> Bool <0.5,a u <-2a -> a -> a forall a. Num a => a -> a -> a * a a a -> a -> a forall a. Num a => a -> a -> a + a a a -> a -> a forall a. Num a => a -> a -> a * a a a -> a -> a forall a. Num a => a -> a -> a + a b a -> a -> a forall a. Num a => a -> a -> a * a b =a -> a forall a. Floating a => a -> a log1p (a u a -> a -> a forall a. Fractional a => a -> a -> a / (1a -> a -> a forall a. Num a => a -> a -> a + a -> a forall a. Floating a => a -> a sqrt (a u a -> a -> a forall a. Num a => a -> a -> a + 1)))a -> a -> Complex a forall a. a -> a -> Complex a :+ a -> a -> a forall a. RealFloat a => a -> a -> a atan2 (1a -> a -> a forall a. Num a => a -> a -> a + a a )a b |Bool otherwise =Complex a -> Complex a forall a. Floating a => a -> a log (1Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a + Complex a x ){-# INLINElog1p #-}expm1 :: Complex a -> Complex a expm1 x :: Complex a x @(a :: a a :+ b :: a b )|a a a -> a -> a forall a. Num a => a -> a -> a * a a a -> a -> a forall a. Num a => a -> a -> a + a b a -> a -> a forall a. Num a => a -> a -> a * a b a -> a -> Bool forall a. Ord a => a -> a -> Bool <1,a u <-a -> a forall a. Floating a => a -> a expm1 a a ,a v <-a -> a forall a. Floating a => a -> a sin (a b a -> a -> a forall a. Fractional a => a -> a -> a / 2),a w <--2a -> a -> a forall a. Num a => a -> a -> a * a v a -> a -> a forall a. Num a => a -> a -> a * a v =(a u a -> a -> a forall a. Num a => a -> a -> a * a w a -> a -> a forall a. Num a => a -> a -> a + a u a -> a -> a forall a. Num a => a -> a -> a + a w )a -> a -> Complex a forall a. a -> a -> Complex a :+ (a u a -> a -> a forall a. Num a => a -> a -> a + 1)a -> a -> a forall a. Num a => a -> a -> a * a -> a forall a. Floating a => a -> a sin a b |Bool otherwise =Complex a -> Complex a forall a. Floating a => a -> a exp Complex a x Complex a -> Complex a -> Complex a forall a. Num a => a -> a -> a - 1{-# INLINEexpm1 #-}-- | @since 4.8.0.0instanceStorable a =>Storable (Complex a )wheresizeOf :: Complex a -> Int sizeOf a :: Complex a a =2Int -> Int -> Int forall a. Num a => a -> a -> a * a -> Int forall a. Storable a => a -> Int sizeOf (Complex a -> a forall a. Complex a -> a realPart Complex a a )alignment :: Complex a -> Int alignment a :: Complex a a =a -> Int forall a. Storable a => a -> Int alignment (Complex a -> a forall a. Complex a -> a realPart Complex a a )peek :: Ptr (Complex a) -> IO (Complex a) peek p :: Ptr (Complex a) p =doPtr a q <-Ptr a -> IO (Ptr a) forall (m :: * -> *) a. Monad m => a -> m a return (Ptr a -> IO (Ptr a)) -> Ptr a -> IO (Ptr a) forall a b. (a -> b) -> a -> b $ Ptr (Complex a) -> Ptr a forall a b. Ptr a -> Ptr b castPtr Ptr (Complex a) p a r <-Ptr a -> IO a forall a. Storable a => Ptr a -> IO a peek Ptr a q a i <-Ptr a -> Int -> IO a forall a. Storable a => Ptr a -> Int -> IO a peekElemOff Ptr a q 1Complex a -> IO (Complex a) forall (m :: * -> *) a. Monad m => a -> m a return (a r a -> a -> Complex a forall a. a -> a -> Complex a :+ a i )poke :: Ptr (Complex a) -> Complex a -> IO () poke p :: Ptr (Complex a) p (r :: a r :+ i :: a i )=doPtr a q <-Ptr a -> IO (Ptr a) forall (m :: * -> *) a. Monad m => a -> m a return (Ptr a -> IO (Ptr a)) -> Ptr a -> IO (Ptr a) forall a b. (a -> b) -> a -> b $ (Ptr (Complex a) -> Ptr a forall a b. Ptr a -> Ptr b castPtr Ptr (Complex a) p )Ptr a -> a -> IO () forall a. Storable a => Ptr a -> a -> IO () poke Ptr a q a r Ptr a -> Int -> a -> IO () forall a. Storable a => Ptr a -> Int -> a -> IO () pokeElemOff Ptr a q 1a i -- | @since 4.9.0.0instanceApplicative Complex wherepure :: a -> Complex a pure a :: a a =a a a -> a -> Complex a forall a. a -> a -> Complex a :+ a a f :: a -> b f :+ g :: a -> b g <*> :: Complex (a -> b) -> Complex a -> Complex b <*> a :: a a :+ b :: a b =a -> b f a a b -> b -> Complex b forall a. a -> a -> Complex a :+ a -> b g a b liftA2 :: (a -> b -> c) -> Complex a -> Complex b -> Complex c liftA2 f :: a -> b -> c f (x :: a x :+ y :: a y )(a :: b a :+ b :: b b )=a -> b -> c f a x b a c -> c -> Complex c forall a. a -> a -> Complex a :+ a -> b -> c f a y b b -- | @since 4.9.0.0instanceMonad Complex wherea :: a a :+ b :: a b >>= :: Complex a -> (a -> Complex b) -> Complex b >>= f :: a -> Complex b f =Complex b -> b forall a. Complex a -> a realPart (a -> Complex b f a a )b -> b -> Complex b forall a. a -> a -> Complex a :+ Complex b -> b forall a. Complex a -> a imagPart (a -> Complex b f a b )-- ------------------------------------------------------------------------------- Rules on Complex{-# RULES"realToFrac/a->Complex Double"realToFrac =\x ->realToFrac x :+ (0::Double)"realToFrac/a->Complex Float"realToFrac =\x ->realToFrac x :+ (0::Float)#-}