| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
SpatialMath
Contents
Synopsis
- data Euler a = Euler {}
- class Floating a => ArcTan2 a where
- rotateXyzAboutX :: Floating a => V3 a -> a -> V3 a
- rotateXyzAboutY :: Floating a => V3 a -> a -> V3 a
- rotateXyzAboutZ :: Floating a => V3 a -> a -> V3 a
- euler321OfQuat :: (ArcTan2 a, Ord a) => Quaternion a -> Euler a
- unsafeEuler321OfQuat :: ArcTan2 a => Quaternion a -> Euler a
- euler321OfDcm :: (Ord a, ArcTan2 a) => M33 a -> Euler a
- unsafeEuler321OfDcm :: ArcTan2 a => M33 a -> Euler a
- quatOfEuler321 :: Floating a => Euler a -> Quaternion a
- dcmOfQuat :: Num a => Quaternion a -> M33 a
- dcmOfQuatB2A :: Num a => Quaternion a -> M33 a
- dcmOfEuler321 :: Floating a => Euler a -> M33 a
- quatOfDcm :: (Floating a, Ord a) => M33 a -> Quaternion a
- quatOfDcmB2A :: (Floating a, Ord a) => M33 a -> Quaternion a
- rotVecByDcm :: Num a => M33 a -> V3 a -> V3 a
- rotVecByDcmB2A :: Num a => M33 a -> V3 a -> V3 a
- rotVecByQuat :: Num a => Quaternion a -> V3 a -> V3 a
- rotVecByQuatB2A :: Num a => Quaternion a -> V3 a -> V3 a
- rotVecByEuler :: (Floating a, Ord a) => Euler a -> V3 a -> V3 a
- rotVecByEulerB2A :: (Floating a, Ord a) => Euler a -> V3 a -> V3 a
- type M33 a = V3 (V3 a)
- data V3 a = V3 !a !a !a
- data Quaternion a = Quaternion !a !(V3 a)
Documentation
3-2-1 Euler angle rotation sequence
Instances
| Functor Euler # | |
| Applicative Euler # | |
| Foldable Euler # | |
Defined in Types Methods fold :: Monoid m => Euler m -> m # foldMap :: Monoid m => (a -> m) -> Euler a -> m # foldr :: (a -> b -> b) -> b -> Euler a -> b # foldr' :: (a -> b -> b) -> b -> Euler a -> b # foldl :: (b -> a -> b) -> b -> Euler a -> b # foldl' :: (b -> a -> b) -> b -> Euler a -> b # foldr1 :: (a -> a -> a) -> Euler a -> a # foldl1 :: (a -> a -> a) -> Euler a -> a # elem :: Eq a => a -> Euler a -> Bool # maximum :: Ord a => Euler a -> a # minimum :: Ord a => Euler a -> a # | |
| Traversable Euler # | |
| (ArcTan2 a, Floating a, Ord a) => Rotation Euler a # | |
| Eq a => Eq (Euler a) # | |
| Data a => Data (Euler a) # | |
Defined in Types Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Euler a -> c (Euler a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Euler a) # toConstr :: Euler a -> Constr # dataTypeOf :: Euler a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Euler a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Euler a)) # gmapT :: (forall b. Data b => b -> b) -> Euler a -> Euler a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Euler a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Euler a -> r # gmapQ :: (forall d. Data d => d -> u) -> Euler a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Euler a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Euler a -> m (Euler a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Euler a -> m (Euler a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Euler a -> m (Euler a) # | |
| Ord a => Ord (Euler a) # | |
| Show a => Show (Euler a) # | |
| Generic (Euler a) # | |
| Binary a => Binary (Euler a) # | |
| Serialize a => Serialize (Euler a) # | |
| Generic1 Euler # | |
| type Rep (Euler a) # | |
Defined in Types type Rep (Euler a) = D1 (MetaData "Euler" "Types" "spatial-math-0.5.0.1-BCf68EO2cdvEFP2DMwbIRL" False) (C1 (MetaCons "Euler" PrefixI True) (S1 (MetaSel (Just "eYaw") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a) :*: (S1 (MetaSel (Just "ePitch") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a) :*: S1 (MetaSel (Just "eRoll") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a)))) | |
| type Rep1 Euler # | |
Defined in Types type Rep1 Euler = D1 (MetaData "Euler" "Types" "spatial-math-0.5.0.1-BCf68EO2cdvEFP2DMwbIRL" False) (C1 (MetaCons "Euler" PrefixI True) (S1 (MetaSel (Just "eYaw") NoSourceUnpackedness NoSourceStrictness DecidedLazy) Par1 :*: (S1 (MetaSel (Just "ePitch") NoSourceUnpackedness NoSourceStrictness DecidedLazy) Par1 :*: S1 (MetaSel (Just "eRoll") NoSourceUnpackedness NoSourceStrictness DecidedLazy) Par1))) | |
class Floating a => ArcTan2 a where #
doesn't require RealFloat, used for overloading symbolics
Minimal complete definition
Methods
arctan2 y x computes the arctangent from two arguments. The
Double and Float instances call out to a sufficiently recent
version of libm to compute this.
The following test cases are the full set of recommended
function properties specified for function atan2Pi() on page 45
of the IEEE Std 754-2008 document.
>>>arctan2 0 (-0) :: Double3.141592653589793>>>arctan2 (-0) (-0) :: Double-3.141592653589793>>>arctan2 0 0 :: Double0.0>>>arctan2 (-0) 0 :: Double-0.0
\x -> x < 0 ==> arctan2 (-0) x == (-pi :: Double)
\x -> x < 0 ==> arctan2 0 x == (pi :: Double)
\x -> x > 0 ==> arctan2 (-0) x == (-0 :: Double)
\x -> x > 0 ==> arctan2 0 x == (0 :: Double)
\y -> y < 0 ==> arctan2 y (-0) == (-pi / 2 :: Double)
\y -> y > 0 ==> arctan2 y 0 == (pi / 2 :: Double)
\y -> y > 0 && not (isNaN y || isInfinite y) ==> arctan2 y (negate $ 1/0) == (pi :: Double)
\y -> y < 0 && not (isNaN y || isInfinite y) ==> arctan2 y (negate $ 1/0) == (-pi :: Double)
\y -> y > 0 && not (isNaN y || isInfinite y) ==> arctan2 y (1/0) == (0 :: Double)
\y -> y < 0 && not (isNaN y || isInfinite y) ==> arctan2 y (1/0) == (-0 :: Double)
\x -> not (isNaN x || isInfinite x) ==> arctan2 (negate $ 1/0) x == (-pi/2 :: Double)
\x -> not (isNaN x || isInfinite x) ==> arctan2 (1/0) x == (pi/2 :: Double)
>>>arctan2 neginf neginf :: Double-2.356194490192345>>>arctan2 inf neginf :: Double2.356194490192345>>>arctan2 neginf inf :: Double-0.7853981633974483>>>arctan2 inf inf :: Double0.7853981633974483
rotateXyzAboutX :: Floating a => V3 a -> a -> V3 a #
Rotate a vector about the X axis
>>>trunc $ rotateXyzAboutX (V3 0 1 0) (pi/2)V3 0.0 0.0 1.0
>>>trunc $ rotateXyzAboutX (V3 0 0 1) (pi/2)V3 0.0 (-1.0) 0.0
rotateXyzAboutY :: Floating a => V3 a -> a -> V3 a #
Rotate a vector about the Y axis
>>>trunc $ rotateXyzAboutY (V3 0 0 1) (pi/2)V3 1.0 0.0 0.0
>>>trunc $ rotateXyzAboutY (V3 1 0 0) (pi/2)V3 0.0 0.0 (-1.0)
rotateXyzAboutZ :: Floating a => V3 a -> a -> V3 a #
Rotate a vector about the Z axis
>>>trunc $ rotateXyzAboutZ (V3 1 0 0) (pi/2)V3 0.0 1.0 0.0
>>>trunc $ rotateXyzAboutZ (V3 0 1 0) (pi/2)V3 (-1.0) 0.0 0.0
euler321OfQuat :: (ArcTan2 a, Ord a) => Quaternion a -> Euler a #
Convert quaternion to Euler angles
>>>euler321OfQuat (Quaternion 1.0 (V3 0.0 0.0 0.0))Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 0.0}
>>>euler321OfQuat (Quaternion (sqrt(2)/2) (V3 (sqrt(2)/2) 0.0 0.0))Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 1.5707963267948966}
>>>euler321OfQuat (Quaternion (sqrt(2)/2) (V3 0.0 (sqrt(2)/2) 0.0))Euler {eYaw = 0.0, ePitch = 1.5707963267948966, eRoll = 0.0}
>>>euler321OfQuat (Quaternion (sqrt(2)/2) (V3 0.0 0.0 (sqrt(2)/2)))Euler {eYaw = 1.5707963267948966, ePitch = -0.0, eRoll = 0.0}
unsafeEuler321OfQuat :: ArcTan2 a => Quaternion a -> Euler a #
Convert quaternion to Euler angles. Returns Nan if 2.0*(q1*q3 - q0*q2) is outside [-1, 1].
>>>unsafeEuler321OfQuat (Quaternion 1.0 (V3 0.0 0.0 0.0))Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 0.0}
>>>unsafeEuler321OfQuat (Quaternion (sqrt(2)/2) (V3 (sqrt(2)/2) 0.0 0.0))Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 1.5707963267948966}
>>>unsafeEuler321OfQuat (Quaternion (sqrt(2)/2) (V3 0.0 (sqrt(2)/2) 0.0))Euler {eYaw = 0.0, ePitch = NaN, eRoll = 0.0}
>>>unsafeEuler321OfQuat (Quaternion (sqrt(2)/2) (V3 0.0 0.0 (sqrt(2)/2)))Euler {eYaw = 1.5707963267948966, ePitch = -0.0, eRoll = 0.0}
euler321OfDcm :: (Ord a, ArcTan2 a) => M33 a -> Euler a #
Convert DCM to euler angles
>>>euler321OfDcm $ V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 0.0}
>>>euler321OfDcm $ V3 (V3 0 1 0) (V3 (-1) 0 0) (V3 0 0 1)Euler {eYaw = 1.5707963267948966, ePitch = -0.0, eRoll = 0.0}
>>>let s = sqrt(2)/2 in euler321OfDcm $ V3 (V3 s s 0) (V3 (-s) s 0) (V3 0 0 1)Euler {eYaw = 0.7853981633974483, ePitch = -0.0, eRoll = 0.0}
unsafeEuler321OfDcm :: ArcTan2 a => M33 a -> Euler a #
Convert DCM to euler angles. Returns Nan if r[1,3] is outside [-1, 1].
>>>unsafeEuler321OfDcm $ V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 0.0}
>>>unsafeEuler321OfDcm $ V3 (V3 0 1 0) (V3 (-1) 0 0) (V3 0 0 1)Euler {eYaw = 1.5707963267948966, ePitch = -0.0, eRoll = 0.0}
>>>let s = sqrt(2)/2 in unsafeEuler321OfDcm $ V3 (V3 s s 0) (V3 (-s) s 0) (V3 0 0 1)Euler {eYaw = 0.7853981633974483, ePitch = -0.0, eRoll = 0.0}
>>>unsafeEuler321OfDcm $ V3 (V3 0 0 1.1) (V3 0 0 0) (V3 0 0 0)Euler {eYaw = 0.0, ePitch = NaN, eRoll = 0.0}
quatOfEuler321 :: Floating a => Euler a -> Quaternion a #
Convert Euler angles to quaternion. The scalar part of the result may be positive or negative.
>>>quatOfEuler321 (Euler 0 0 0)Quaternion 1.0 (V3 0.0 0.0 0.0)
>>>quatOfEuler321 (Euler (pi/2) 0 0)Quaternion 0.7071067811865476 (V3 0.0 0.0 0.7071067811865475)
>>>quatOfEuler321 (Euler 0 (pi/2) 0)Quaternion 0.7071067811865476 (V3 0.0 0.7071067811865475 0.0)
>>>quatOfEuler321 (Euler 0 0 (pi/2))Quaternion 0.7071067811865476 (V3 0.7071067811865475 0.0 0.0)
dcmOfQuat :: Num a => Quaternion a -> M33 a #
convert a quaternion to a DCM
>>>dcmOfQuat $ Quaternion 1.0 (V3 0.0 0.0 0.0)V3 (V3 1.0 0.0 0.0) (V3 0.0 1.0 0.0) (V3 0.0 0.0 1.0)
>>>let s = sqrt(2)/2 in fmap trunc $ dcmOfQuat $ Quaternion s (V3 0.0 0.0 s)V3 (V3 0.0 1.0 0.0) (V3 (-1.0) 0.0 0.0) (V3 0.0 0.0 1.0)
>>>dcmOfQuat $ Quaternion 0.9238795325112867 (V3 0.0 0.0 0.3826834323650898)V3 (V3 0.7071067811865475 0.7071067811865476 0.0) (V3 (-0.7071067811865476) 0.7071067811865475 0.0) (V3 0.0 0.0 1.0)
dcmOfQuatB2A :: Num a => Quaternion a -> M33 a #
dcmOfEuler321 :: Floating a => Euler a -> M33 a #
Convert DCM to euler angles
>>>fmap trunc $ dcmOfEuler321 $ Euler {eYaw = 0.0, ePitch = 0, eRoll = 0}V3 (V3 1.0 0.0 0.0) (V3 0.0 1.0 0.0) (V3 0.0 0.0 1.0)
>>>fmap trunc $ dcmOfEuler321 $ Euler {eYaw = pi/2, ePitch = 0, eRoll = 0}V3 (V3 0.0 1.0 0.0) (V3 (-1.0) 0.0 0.0) (V3 0.0 0.0 1.0)
>>>fmap trunc $ dcmOfEuler321 $ Euler {eYaw = pi/4, ePitch = 0, eRoll = 0}V3 (V3 0.7071067811865476 0.7071067811865475 0.0) (V3 (-0.7071067811865475) 0.7071067811865476 0.0) (V3 0.0 0.0 1.0)
quatOfDcm :: (Floating a, Ord a) => M33 a -> Quaternion a #
convert a DCM to a quaternion
>>>quatOfDcm $ V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)Quaternion 1.0 (V3 0.0 0.0 0.0)
>>>quatOfDcm $ V3 (V3 0 1 0) (V3 (-1) 0 0) (V3 0 0 1)Quaternion 0.7071067811865476 (V3 0.0 0.0 0.7071067811865475)
>>>let s = sqrt(2)/2 in quatOfDcm $ V3 (V3 s s 0) (V3 (-s) s 0) (V3 0 0 1)Quaternion 0.9238795325112867 (V3 0.0 0.0 0.3826834323650898)
quatOfDcmB2A :: (Floating a, Ord a) => M33 a -> Quaternion a #
rotVecByQuat :: Num a => Quaternion a -> V3 a -> V3 a #
vec_b = q_a2b * vec_a * q_a2b^(-1) vec_b = R(q_a2b) * vec_a
rotVecByQuatB2A :: Num a => Quaternion a -> V3 a -> V3 a #
re-exported from linear
A 3-dimensional vector
Constructors
| V3 !a !a !a |
Instances
| Monad V3 | |
| Functor V3 | |
| MonadFix V3 | |
| Applicative V3 | |
| Foldable V3 | |
Defined in Linear.V3 Methods fold :: Monoid m => V3 m -> m # foldMap :: Monoid m => (a -> m) -> V3 a -> m # foldr :: (a -> b -> b) -> b -> V3 a -> b # foldr' :: (a -> b -> b) -> b -> V3 a -> b # foldl :: (b -> a -> b) -> b -> V3 a -> b # foldl' :: (b -> a -> b) -> b -> V3 a -> b # foldr1 :: (a -> a -> a) -> V3 a -> a # foldl1 :: (a -> a -> a) -> V3 a -> a # elem :: Eq a => a -> V3 a -> Bool # maximum :: Ord a => V3 a -> a # | |
| Traversable V3 | |
| Distributive V3 | |
| Representable V3 | |
| Eq1 V3 | |
| Ord1 V3 | |
| Read1 V3 | |
| Show1 V3 | |
| MonadZip V3 | |
| Serial1 V3 | |
Defined in Linear.V3 Methods serializeWith :: MonadPut m => (a -> m ()) -> V3 a -> m () # deserializeWith :: MonadGet m => m a -> m (V3 a) # | |
| Hashable1 V3 | |
| Apply V3 | |
| Traversable1 V3 | |
| Trace V3 | |
| R3 V3 | |
| R2 V3 | |
| R1 V3 | |
| Finite V3 | |
| Metric V3 | |
| Additive V3 | |
| Foldable1 V3 | |
| Bind V3 | |
| Unbox a => Vector Vector (V3 a) | |
Defined in Linear.V3 Methods basicUnsafeFreeze :: PrimMonad m => Mutable Vector (PrimState m) (V3 a) -> m (Vector (V3 a)) # basicUnsafeThaw :: PrimMonad m => Vector (V3 a) -> m (Mutable Vector (PrimState m) (V3 a)) # basicLength :: Vector (V3 a) -> Int # basicUnsafeSlice :: Int -> Int -> Vector (V3 a) -> Vector (V3 a) # basicUnsafeIndexM :: Monad m => Vector (V3 a) -> Int -> m (V3 a) # basicUnsafeCopy :: PrimMonad m => Mutable Vector (PrimState m) (V3 a) -> Vector (V3 a) -> m () # | |
| Num r => Coalgebra r (E V3) | |
| Unbox a => MVector MVector (V3 a) | |
Defined in Linear.V3 Methods basicLength :: MVector s (V3 a) -> Int # basicUnsafeSlice :: Int -> Int -> MVector s (V3 a) -> MVector s (V3 a) # basicOverlaps :: MVector s (V3 a) -> MVector s (V3 a) -> Bool # basicUnsafeNew :: PrimMonad m => Int -> m (MVector (PrimState m) (V3 a)) # basicInitialize :: PrimMonad m => MVector (PrimState m) (V3 a) -> m () # basicUnsafeReplicate :: PrimMonad m => Int -> V3 a -> m (MVector (PrimState m) (V3 a)) # basicUnsafeRead :: PrimMonad m => MVector (PrimState m) (V3 a) -> Int -> m (V3 a) # basicUnsafeWrite :: PrimMonad m => MVector (PrimState m) (V3 a) -> Int -> V3 a -> m () # basicClear :: PrimMonad m => MVector (PrimState m) (V3 a) -> m () # basicSet :: PrimMonad m => MVector (PrimState m) (V3 a) -> V3 a -> m () # basicUnsafeCopy :: PrimMonad m => MVector (PrimState m) (V3 a) -> MVector (PrimState m) (V3 a) -> m () # basicUnsafeMove :: PrimMonad m => MVector (PrimState m) (V3 a) -> MVector (PrimState m) (V3 a) -> m () # basicUnsafeGrow :: PrimMonad m => MVector (PrimState m) (V3 a) -> Int -> m (MVector (PrimState m) (V3 a)) # | |
| Bounded a => Bounded (V3 a) | |
| Eq a => Eq (V3 a) | |
| Floating a => Floating (V3 a) | |
| Fractional a => Fractional (V3 a) | |
| Data a => Data (V3 a) | |
Defined in Linear.V3 Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> V3 a -> c (V3 a) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (V3 a) # dataTypeOf :: V3 a -> DataType # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (V3 a)) # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (V3 a)) # gmapT :: (forall b. Data b => b -> b) -> V3 a -> V3 a # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> V3 a -> r # gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> V3 a -> r # gmapQ :: (forall d. Data d => d -> u) -> V3 a -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> V3 a -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> V3 a -> m (V3 a) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> V3 a -> m (V3 a) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> V3 a -> m (V3 a) # | |
| Num a => Num (V3 a) | |
| Ord a => Ord (V3 a) | |
| Read a => Read (V3 a) | |
| Show a => Show (V3 a) | |
| Ix a => Ix (V3 a) | |
| Generic (V3 a) | |
| Storable a => Storable (V3 a) | |
| Binary a => Binary (V3 a) | |
| Serial a => Serial (V3 a) | |
| Serialize a => Serialize (V3 a) | |
| NFData a => NFData (V3 a) | |
| Hashable a => Hashable (V3 a) | |
| Unbox a => Unbox (V3 a) | |
Defined in Linear.V3 | |
| Ixed (V3 a) | |
| Epsilon a => Epsilon (V3 a) | |
| Generic1 V3 | |
| FunctorWithIndex (E V3) V3 | |
| FoldableWithIndex (E V3) V3 | |
Defined in Linear.V3 Methods ifoldMap :: Monoid m => (E V3 -> a -> m) -> V3 a -> m # ifolded :: (Indexable (E V3) p, Contravariant f, Applicative f) => p a (f a) -> V3 a -> f (V3 a) # ifoldr :: (E V3 -> a -> b -> b) -> b -> V3 a -> b # ifoldl :: (E V3 -> b -> a -> b) -> b -> V3 a -> b # | |
| TraversableWithIndex (E V3) V3 | |
| Each (V3 a) (V3 b) a b | |
| Field1 (V3 a) (V3 a) a a | |
| Field2 (V3 a) (V3 a) a a | |
| Field3 (V3 a) (V3 a) a a | |
| Num a => Rotation (V3 :. V3) a # | |
| type Rep V3 | |
| type Size V3 | |
| data MVector s (V3 a) | |
| type Rep (V3 a) | |
Defined in Linear.V3 type Rep (V3 a) = D1 (MetaData "V3" "Linear.V3" "linear-1.20.8-71KE8HaDWJk9VTUReACBrP" False) (C1 (MetaCons "V3" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a) :*: (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) (Rec0 a)))) | |
| data Vector (V3 a) | |
| type Index (V3 a) | |
| type IxValue (V3 a) | |
| type Rep1 V3 | |
Defined in Linear.V3 type Rep1 V3 = D1 (MetaData "V3" "Linear.V3" "linear-1.20.8-71KE8HaDWJk9VTUReACBrP" False) (C1 (MetaCons "V3" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) Par1 :*: (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) Par1 :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness SourceStrict DecidedStrict) Par1))) | |
data Quaternion a #
Quaternions
Constructors
| Quaternion !a !(V3 a) |