| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
SpatialMathT
Contents
Synopsis
- class Floating a => ArcTan2 a where
- data Euler a = Euler {}
- data Quaternion a = Quaternion !a !(V3 a)
- data V3 a = V3 !a !a !a
- class Rotation g a where
- newtype Rot f1 f2 r a = Rot {
- unRot :: r a
- newtype V3T f a = V3T {}
- class R1 (t :: * -> *) where
- class R1 t => R2 (t :: * -> *) where
- class R2 t => R3 (t :: * -> *) where
- cross :: Num a => V3T f a -> V3T f a -> V3T f a
- orthonormalize :: Floating a => Rot f1 f2 (V3 :. V3) a -> Rot f1 f2 (V3 :. V3) a
- dcmOfQuat :: Num a => Rot f g Quaternion a -> Rot f g (V3 :. V3) a
- dcmOfEuler321 :: Floating a => Rot f g Euler a -> Rot f g (V3 :. V3) a
- quatOfDcm :: (Floating a, Ord a) => Rot f g (V3 :. V3) a -> Rot f g Quaternion a
- quatOfEuler321 :: Floating a => Rot f g Euler a -> Rot f g Quaternion a
- euler321OfDcm :: (ArcTan2 a, Ord a) => Rot f g (V3 :. V3) a -> Rot f g Euler a
- unsafeEuler321OfDcm :: ArcTan2 a => Rot f g (V3 :. V3) a -> Rot f g Euler a
- euler321OfQuat :: (ArcTan2 a, Ord a) => Rot f g Quaternion a -> Rot f g Euler a
- unsafeEuler321OfQuat :: ArcTan2 a => Rot f g Quaternion a -> Rot f g Euler a
- newtype ((g :: k2 -> *) :. (f :: k1 -> k2)) (a :: k1) :: forall k2 k1. (k2 -> *) -> (k1 -> k2) -> k1 -> * = O (g (f a))
- unO :: (g :. f) a -> g (f a)
Documentation
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
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))) | |
data Quaternion a #
Quaternions
Constructors
| Quaternion !a !(V3 a) |
Instances
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))) | |
Methods
compose :: Rot f1 f2 g a -> Rot f2 f3 g a -> Rot f1 f3 g a #
rot :: Rot f1 f2 g a -> V3T f1 a -> V3T f2 a #
rot' :: Rot f1 f2 g a -> V3T f2 a -> V3T f1 a #
Instances
| Num a => Rotation Quaternion a # | |
Defined in SpatialMathT Methods compose :: Rot f1 f2 Quaternion a -> Rot f2 f3 Quaternion a -> Rot f1 f3 Quaternion a # rot :: Rot f1 f2 Quaternion a -> V3T f1 a -> V3T f2 a # rot' :: Rot f1 f2 Quaternion a -> V3T f2 a -> V3T f1 a # transpose :: Rot f1 f2 Quaternion a -> Rot f2 f1 Quaternion a # identity :: Rot f1 f2 Quaternion a # | |
| (ArcTan2 a, Floating a, Ord a) => Rotation Euler a # | |
| Num a => Rotation (V3 :. V3) a # | |
Instances
| Generic1 (Rot f1 f2 r :: * -> *) # | |
| Functor r => Functor (Rot f1 f2 r) # | |
| Applicative r => Applicative (Rot f1 f2 r) # | |
Defined in SpatialMathT | |
| Foldable r => Foldable (Rot f1 f2 r) # | |
Defined in SpatialMathT Methods fold :: Monoid m => Rot f1 f2 r m -> m # foldMap :: Monoid m => (a -> m) -> Rot f1 f2 r a -> m # foldr :: (a -> b -> b) -> b -> Rot f1 f2 r a -> b # foldr' :: (a -> b -> b) -> b -> Rot f1 f2 r a -> b # foldl :: (b -> a -> b) -> b -> Rot f1 f2 r a -> b # foldl' :: (b -> a -> b) -> b -> Rot f1 f2 r a -> b # foldr1 :: (a -> a -> a) -> Rot f1 f2 r a -> a # foldl1 :: (a -> a -> a) -> Rot f1 f2 r a -> a # toList :: Rot f1 f2 r a -> [a] # null :: Rot f1 f2 r a -> Bool # length :: Rot f1 f2 r a -> Int # elem :: Eq a => a -> Rot f1 f2 r a -> Bool # maximum :: Ord a => Rot f1 f2 r a -> a # minimum :: Ord a => Rot f1 f2 r a -> a # | |
| Traversable r => Traversable (Rot f1 f2 r) # | |
Defined in SpatialMathT | |
| Eq (r a) => Eq (Rot f1 f2 r a) # | |
| Fractional (r a) => Fractional (Rot f1 f2 r a) # | |
| Num (r a) => Num (Rot f1 f2 r a) # | |
Defined in SpatialMathT Methods (+) :: Rot f1 f2 r a -> Rot f1 f2 r a -> Rot f1 f2 r a # (-) :: Rot f1 f2 r a -> Rot f1 f2 r a -> Rot f1 f2 r a # (*) :: Rot f1 f2 r a -> Rot f1 f2 r a -> Rot f1 f2 r a # negate :: Rot f1 f2 r a -> Rot f1 f2 r a # abs :: Rot f1 f2 r a -> Rot f1 f2 r a # signum :: Rot f1 f2 r a -> Rot f1 f2 r a # fromInteger :: Integer -> Rot f1 f2 r a # | |
| Ord (r a) => Ord (Rot f1 f2 r a) # | |
Defined in SpatialMathT Methods compare :: Rot f1 f2 r a -> Rot f1 f2 r a -> Ordering # (<) :: Rot f1 f2 r a -> Rot f1 f2 r a -> Bool # (<=) :: Rot f1 f2 r a -> Rot f1 f2 r a -> Bool # (>) :: Rot f1 f2 r a -> Rot f1 f2 r a -> Bool # (>=) :: Rot f1 f2 r a -> Rot f1 f2 r a -> Bool # | |
| Show (r a) => Show (Rot f1 f2 r a) # | |
| Generic (Rot f1 f2 r a) # | |
| Storable (r a) => Storable (Rot f1 f2 r a) # | |
Defined in SpatialMathT Methods sizeOf :: Rot f1 f2 r a -> Int # alignment :: Rot f1 f2 r a -> Int # peekElemOff :: Ptr (Rot f1 f2 r a) -> Int -> IO (Rot f1 f2 r a) # pokeElemOff :: Ptr (Rot f1 f2 r a) -> Int -> Rot f1 f2 r a -> IO () # peekByteOff :: Ptr b -> Int -> IO (Rot f1 f2 r a) # pokeByteOff :: Ptr b -> Int -> Rot f1 f2 r a -> IO () # | |
| Binary (r a) => Binary (Rot f1 f2 r a) # | |
| Serialize (r a) => Serialize (Rot f1 f2 r a) # | |
| type Rep1 (Rot f1 f2 r :: * -> *) # | |
Defined in SpatialMathT | |
| type Rep (Rot f1 f2 r a) # | |
Defined in SpatialMathT | |
Instances
| Functor (V3T f) # | |
| Applicative (V3T f) # | |
| Foldable (V3T f) # | |
Defined in SpatialMathT Methods fold :: Monoid m => V3T f m -> m # foldMap :: Monoid m => (a -> m) -> V3T f a -> m # foldr :: (a -> b -> b) -> b -> V3T f a -> b # foldr' :: (a -> b -> b) -> b -> V3T f a -> b # foldl :: (b -> a -> b) -> b -> V3T f a -> b # foldl' :: (b -> a -> b) -> b -> V3T f a -> b # foldr1 :: (a -> a -> a) -> V3T f a -> a # foldl1 :: (a -> a -> a) -> V3T f a -> a # elem :: Eq a => a -> V3T f a -> Bool # maximum :: Ord a => V3T f a -> a # minimum :: Ord a => V3T f a -> a # | |
| Traversable (V3T f) # | |
| R3 (V3T f) # | |
| R2 (V3T f) # | |
| R1 (V3T f) # | |
| Metric (V3T f) # | |
| Additive (V3T f) # | |
| Generic1 (V3T f :: * -> *) # | |
| Eq a => Eq (V3T f a) # | |
| Fractional a => Fractional (V3T f a) # | |
| Num a => Num (V3T f a) # | |
| Ord a => Ord (V3T f a) # | |
| Show a => Show (V3T f a) # | |
| Generic (V3T f a) # | |
| Storable a => Storable (V3T f a) # | |
| Binary a => Binary (V3T f a) # | |
| Serialize a => Serialize (V3T f a) # | |
| type Rep1 (V3T f :: * -> *) # | |
Defined in SpatialMathT | |
| type Rep (V3T f a) # | |
Defined in SpatialMathT | |
class R1 (t :: * -> *) where #
A space that has at least 1 basis vector _x.
Minimal complete definition
class R1 t => R2 (t :: * -> *) where #
Minimal complete definition
Methods
_y :: Functor f => (a -> f a) -> t a -> f (t a) #
>>>V2 1 2 ^._y2
>>>V2 1 2 & _y .~ 3V2 1 3
quatOfEuler321 :: Floating a => Rot f g Euler a -> Rot f g Quaternion a #
euler321OfQuat :: (ArcTan2 a, Ord a) => Rot f g Quaternion a -> Rot f g Euler a #
unsafeEuler321OfQuat :: ArcTan2 a => Rot f g Quaternion a -> Rot f g Euler a #
re-export for convenience
newtype ((g :: k2 -> *) :. (f :: k1 -> k2)) (a :: k1) :: forall k2 k1. (k2 -> *) -> (k1 -> k2) -> k1 -> * infixl 9 #
Composition of unary type constructors
There are (at least) two useful Monoid instances, so you'll have to
pick one and type-specialize it (filling in all or parts of g and/or f).
-- standard Monoid instance for Applicative applied to Monoid
instance (Applicative (g :. f), Monoid a) => Monoid ((g :. f) a) where
{ mempty = pure mempty; mappend = liftA2 mappend }
-- Especially handy when g is a Monoid_f.
instance Monoid (g (f a)) => Monoid ((g :. f) a) where
{ mempty = O mempty; mappend = inO2 mappend }Corresponding to the first and second definitions above,
instance (Applicative g, Monoid_f f) => Monoid_f (g :. f) where
{ mempty_f = O (pure mempty_f); mappend_f = inO2 (liftA2 mappend_f) }
instance Monoid_f g => Monoid_f (g :. f) where
{ mempty_f = O mempty_f; mappend_f = inO2 mappend_f }Similarly, there are two useful Functor instances and two useful
ContraFunctor instances.
instance ( Functor g, Functor f) => Functor (g :. f) where fmap = fmapFF
instance (ContraFunctor g, ContraFunctor f) => Functor (g :. f) where fmap = fmapCC
instance ( Functor g, ContraFunctor f) => ContraFunctor (g :. f) where contraFmap = contraFmapFC
instance (ContraFunctor g, Functor f) => ContraFunctor (g :. f) where contraFmap = contraFmapCFHowever, it's such a bother to define the Functor instances per composition type, I've left the fmapFF case in. If you want the fmapCC one, you're out of luck for now. I'd love to hear a good solution. Maybe someday Haskell will do Prolog-style search for instances, subgoaling the constraints, rather than just matching instance heads.
Constructors
| O (g (f a)) |
Instances
| Functor g => Generic1 (g :. f :: k -> *) | |
| (Functor g, Functor f) => Functor (g :. f) | |
| (Applicative g, Applicative f) => Applicative (g :. f) | |
| (Foldable g, Foldable f, Functor g) => Foldable (g :. f) | |
Defined in Control.Compose Methods fold :: Monoid m => (g :. f) m -> m # foldMap :: Monoid m => (a -> m) -> (g :. f) a -> m # foldr :: (a -> b -> b) -> b -> (g :. f) a -> b # foldr' :: (a -> b -> b) -> b -> (g :. f) a -> b # foldl :: (b -> a -> b) -> b -> (g :. f) a -> b # foldl' :: (b -> a -> b) -> b -> (g :. f) a -> b # foldr1 :: (a -> a -> a) -> (g :. f) a -> a # foldl1 :: (a -> a -> a) -> (g :. f) a -> a # elem :: Eq a => a -> (g :. f) a -> Bool # maximum :: Ord a => (g :. f) a -> a # minimum :: Ord a => (g :. f) a -> a # | |
| (Traversable g, Traversable f) => Traversable (g :. f) | |
| Num a => Rotation (V3 :. V3) a # | |
| Eq (g (f a)) => Eq ((g :. f) a) | |
| Ord (g (f a)) => Ord ((g :. f) a) | |
| Show (g (f a)) => Show ((g :. f) a) | |
| Generic ((g :. f) a) | |
| type Rep1 (g :. f :: k -> *) | |
| type Rep ((g :. f) a) | |
Defined in Control.Compose | |