!"#$%& ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [\]^_`abc d efghijklmnopqrstuvwxyz{|}~ Safe-InferredSerialize a linear type. Deserialize a linear type. portable provisionalEdward Kmett <ekmett@gmail.com> Trustworthy portable provisionalEdward Kmett <ekmett@gmail.com> Trustworthy9A vector is an additive group with additional structure. The zero vector Compute the sum of two vectors V2 1 2 ^+^ V2 3 4V2 4 6+Compute the difference between two vectors V2 4 5 - V2 3 1V2 1 4*Linearly interpolate between two vectors. Apply a function to merge the  'non-zero'= components of two vectors, unioning the rest of the values. * For a dense vector this is equivalent to . + For a sparse vector this is equivalent to . 3Apply a function to the components of two vectors. * For a dense vector this is equivalent to . + For a sparse vector this is equivalent to . !Compute the negation of a vector negated (V2 2 4) V2 (-2) (-4) Sum over multiple vectors sumV [V2 1 1, V2 3 4]V2 4 5  Compute the left scalar product  2 *^ V2 3 4V2 6 8 !Compute the right scalar product  V2 3 4 ^* 2V2 6 8+Compute division by a scalar on the right. BProduce a default basis for a vector space. If the dimensionality 2 of the vector space is not statically known, see . :Produce a default basis for a vector space from which the  argument is drawn. )Produce a diagonal matrix from a vector. &Outer (tensor) product of two vectors $      portable provisionalEdward Kmett <ekmett@gmail.com> Safe-InferredEProvides a fairly subjective test to see if a quantity is near zero. nearZero (1e-11 :: Double)FalsenearZero (1e-17 :: Double)TruenearZero (1e-5 :: Float)FalsenearZero (1e-7 :: Float)True&Determine if a quantity is near zero.  a  1e-12  a  1e-6  a  1e-12  a  1e-6 non-portable experimentalEdward Kmett <ekmett@gmail.com> TrustworthyFree and sparse inner product/metric spaces. ;Compute the inner product of two vectors or (equivalently)  convert a vector f a into a covector f a -> a. V2 1 2 `dot` V2 3 4119Compute the squared norm. The name quadrance arises from  Norman J. Wildberger's rational trigonometry. (Compute the quadrance of the difference ;Compute the distance between two vectors in a metric space /Compute the norm of a vector in a metric space *Convert a non-zero vector to unit vector.  Normalize a  functor to have unit . This function $ does not change the functor if its  is 0 or 1.  non-portable experimentalEdward Kmett <ekmett@gmail.com> Safe-InferredA  f+ is corepresentable if it is isomorphic to (x -> a) E for some x. Nearly all such functors can be represented by choosing x to be ? the set of lenses that are polymorphic in the contents of the ,  that is to say x = Rep f is a valid choice of x for (nearly) every   Representable . PForm a structure by applying the given function to lenses focused on its holes.    :: ((forall x.  (f x) x) -> a) -> f a This is a generalization of " to work over any corepresentable .    ::  f => Lens s t a b -> Lens (f s) (f t) (f a) (f b)   non-portable experimentalEdward Kmett <ekmett@gmail.com> Trustworthy A 0-dimensional vector pure 1 :: V0 IntV0V0 + V0V0 ! ! ! ! non-portable experimentalEdward Kmett <ekmett@gmail.com> Trustworthy")A space that has at least 1 basis vector #. # V1 2 ^._x2V1 2 & _x .~ 3V1 3   # :: Lens' (t a) a $A 1-dimensional vector pure 1 :: V1 IntV1 1 V1 2 + V1 3V1 5 V1 2 * V1 3V1 6 sum (V1 2)2"#$%"#$%$%"#"#$%  non-portable experimentalEdward Kmett <ekmett@gmail.com> Trustworthy&6A space that distinguishes 2 orthogonal basis vectors # and ', but may have more. ' V2 1 2 ^._y2V2 1 2 & _y .~ 3V2 1 3   ' :: Lens' (t a) a (   ( :: Lens' (t a) () a) )A 2-dimensional vector pure 1 :: V2 IntV2 1 1V2 1 2 + V2 3 4V2 4 6V2 1 2 * V2 3 4V2 3 8 sum (V2 1 2)3++the counter-clockwise perpendicular vector perp $ V2 10 20 V2 (-20) 10&'()*+"#&'()*+)*"#&'(+&'()*+  non-portable experimentalEdward Kmett <ekmett@gmail.com> Trustworthy,7A space that distinguishes 3 orthogonal basis vectors: #, ', and -. (It may have more) -   - :: Lens' (t a) a .   . :: Lens' (t a) (/ a) /A 3-dimensional vector 1cross product 2scalar triple product ,-./012      "#&'(,-./012 /012"#&'(,-.,-./012       non-portable experimentalEdward Kmett <ekmett@gmail.com> Trustworthy34A space that distinguishes orthogonal basis vectors #, ', -, 4. (It may have more.) 4   4 :: Lens' (t a) a 5   5 :: Lens' (t a) (6 a) 6A 4-dimensional vector. 8OConvert a 3-dimensional affine vector into a 4-dimensional homogeneous vector. 9NConvert a 3-dimensional affine point into a 4-dimensional homogeneous vector. :@Convert 4-dimensional projective coordinates to a 3-dimensional ' point. This operation may be denoted, euclidean [x:y:z:w] = (x/w,  y/w, z/w). where the projective, homogenous, coordinate  [x:y:z:w]/ is one of many associated with a single point (x/w,  y/w, z/w). 3456789: !"#$%&'()*+,-./"#&'(,-.3456789:6789:"#&'(,-.3453456789: !"#$%&'()*+,-./  non-portable experimentalEdward Kmett <ekmett@gmail.com> Trustworthy ;?When lines are represented as Plcker coordinates, we have the 3 ability to check for both directed and undirected ' equality. Undirected equality between =s (or a = and a  <;) checks that the two lines coincide in 3D space. Directed  equality, between two <)s, checks that two lines coincide in 3D, A and have the same direction. To accomodate these two notions of  equality, we use an 0 instance on the ; data type. For example, to check the directed equality between two lines,  p1 and p2 , we write, Ray p1 == Ray p2. >(Describe how two lines pass each other. ?+The lines pass each other counterclockwise  (left-handed screw). @2The lines pass each other clockwise (right-handed  screw) A3The lines are coplanar (parallel or intersecting). B8Plcker coordinates for lines in a 3-dimensional space. D>Given a pair of points represented by homogeneous coordinates B generate Plcker coordinates for the line through them, directed $ from the second towards the first. E@Given a pair of 3D points, generate Plcker coordinates for the @ line through them, directed from the second towards the first. FOThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   F :: Lens' (B a) a  G :: Lens' (B a) a  H :: Lens' (B a) a  I :: Lens' (B a) a  J :: Lens' (B a) a  K :: Lens' (B a) a GOThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   F :: Lens' (B a) a  G :: Lens' (B a) a  H :: Lens' (B a) a  I :: Lens' (B a) a  J :: Lens' (B a) a  K :: Lens' (B a) a HOThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   F :: Lens' (B a) a  G :: Lens' (B a) a  H :: Lens' (B a) a  I :: Lens' (B a) a  J :: Lens' (B a) a  K :: Lens' (B a) a IOThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   F :: Lens' (B a) a  G :: Lens' (B a) a  H :: Lens' (B a) a  I :: Lens' (B a) a  J :: Lens' (B a) a  K :: Lens' (B a) a JOThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   F :: Lens' (B a) a  G :: Lens' (B a) a  H :: Lens' (B a) a  I :: Lens' (B a) a  J :: Lens' (B a) a  K :: Lens' (B a) a KOThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   F :: Lens' (B a) a  G :: Lens' (B a) a  H :: Lens' (B a) a  I :: Lens' (B a) a  J :: Lens' (B a) a  K :: Lens' (B a) a LZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   L :: 1 a => Lens' (B a) a  M :: 1 a => Lens' (B a) a  N :: 1 a => Lens' (B a) a  O :: 1 a => Lens' (B a) a  P :: 1 a => Lens' (B a) a  Q :: 1 a => Lens' (B a) a MZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   L :: 1 a => Lens' (B a) a  M :: 1 a => Lens' (B a) a  N :: 1 a => Lens' (B a) a  O :: 1 a => Lens' (B a) a  P :: 1 a => Lens' (B a) a  Q :: 1 a => Lens' (B a) a NZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   L :: 1 a => Lens' (B a) a  M :: 1 a => Lens' (B a) a  N :: 1 a => Lens' (B a) a  O :: 1 a => Lens' (B a) a  P :: 1 a => Lens' (B a) a  Q :: 1 a => Lens' (B a) a OZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   L :: 1 a => Lens' (B a) a  M :: 1 a => Lens' (B a) a  N :: 1 a => Lens' (B a) a  O :: 1 a => Lens' (B a) a  P :: 1 a => Lens' (B a) a  Q :: 1 a => Lens' (B a) a PZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   L :: 1 a => Lens' (B a) a  M :: 1 a => Lens' (B a) a  N :: 1 a => Lens' (B a) a  O :: 1 a => Lens' (B a) a  P :: 1 a => Lens' (B a) a  Q :: 1 a => Lens' (B a) a QZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4).   L :: 1 a => Lens' (B a) a  M :: 1 a => Lens' (B a) a  N :: 1 a => Lens' (B a) a  O :: 1 a => Lens' (B a) a  P :: 1 a => Lens' (B a) a  Q :: 1 a => Lens' (B a) a RValid Plcker coordinates p will have R p 2 0 PThat said, floating point makes a mockery of this claim, so you may want to use . SThis isn'Yt th actual metric because this bilinear form gives rise to an isotropic quadratic space T@Checks if the line is near-isotropic (isotropic vectors in this 4 quadratic space represent lines in real 3d space). U5Checks if two lines intersect (or nearly intersect). V%Check how two lines pass each other.  passes l1 l2 describes  l2 when looking down l1. W"Checks if two lines are parallel. 3@Represent a Plcker coordinate as a pair of 3-tuples, typically  denoted U and V. 4LChecks if two lines coincide in space. In other words, undirected equality. 59Checks if two lines coincide in space, and have the same  orientation. X8The minimum squared distance of a line from the origin. Y1The point where a line is closest to the origin. Z>Not all 6-dimensional points correspond to a line in 3D. This A predicate tests that a Plcker coordinate lies on the Grassmann 0 manifold, and does indeed represent a 3D line. 7;<=>?@ABCDEFGHIJKLMNOPQ6RSTUVW345XYZ789:;<=>?@ABCDEFGHI ;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ BCRTSDEWU>A@?VXYZ;=<FGHLKPMQINJO1;=<>A@?BCDEFGHIJKLMNOPQ6RSTUVW345XYZ789:;<=>?@ABCDEFGHI non-portable experimentalEdward Kmett <ekmett@gmail.com> TrustworthyJ[K\]^_L`abMNOPQRSTUVWXYZ[\] [\]^_`ab [\_]^`abJ[K\]^_L`abMNOPQRSTUVWXYZ[\]  non-portable experimentalEdward Kmett <ekmett@gmail.com> Safe-InferredcAn involutive ring d<Conjugate a value. This defaults to the trivial involution. conjugate (1 :+ 2) 1.0 :+ (-2.0) conjugate 11cd^_`abcdefghijklmcdcdcd^_`abcdefghijklm non-portable experimentalEdward Kmett <ekmett@gmail.com> Trustworthye0A vector space that includes the basis elements j, k, f and g f   f :: Lens' (t a) a g   g :: Lens' (t a) a h   h :: Lens' (t a) (V3 a) i0A vector space that includes the basis elements j and k j   j :: Lens' (t a) a k   k :: Lens' (t a) a l Quaternions n%quadrance of the imaginary component n norm of the imaginary component oraise a l to a scalar power o1Helper for calculating with specific branch cuts p1Helper for calculating with specific branch cuts pq with a specified branch cut. qr with a specified branch cut. rs with a specified branch cut. st with a specified branch cut. tu with a specified branch cut. uv with a specified branch cut. v8Spherical linear interpolation between two quaternions. wApply a rotation to a vector. xx axis theta builds a l representing a  rotation of theta radians about axis. .efghijklmwxnnooppqrstuvwxyz{|}~efghijklmnopqrstuvwxlmijkefghvpqrstunowx(efghijklmwxnnooppqrstuvwxyz{|}~ non-portable experimentalEdward Kmett <ekmett@gmail.com> TrustworthyzCompute the trace of a matrix trace (V2 (V2 a b) (V2 c d))a + d{!Compute the diagonal of a matrix diagonal (V2 (V2 a b) (V2 c d))V2 a dyz{yz{yz{yz{ non-portable experimentalEdward Kmett <ekmett@gmail.com> Trustworthy|+A 4x3 matrix with row-major representation }+A 4x4 matrix with row-major representation ~+A 3x3 matrix with row-major representation +A 2x2 matrix with row-major representation UMatrix product. This can compute any combination of sparse and dense multiplication. :V2 (V3 1 2 3) (V3 4 5 6) !*! V3 (V2 1 2) (V2 3 4) (V2 4 5)V2 (V2 19 25) (V2 43 58)SV2 (fromList [(1,2)]) (fromList [(2,3)]) !*! fromList [(1,V3 0 0 1), (2, V3 0 0 5)]V2 (V3 0 0 2) (V3 0 0 15)Entry-wise matrix addition. 5V2 (V3 1 2 3) (V3 4 5 6) !+! V2 (V3 7 8 9) (V3 1 2 3)V2 (V3 8 10 12) (V3 5 7 9)Entry-wise matrix subtraction. 5V2 (V3 1 2 3) (V3 4 5 6) !-! V2 (V3 7 8 9) (V3 1 2 3)!V2 (V3 (-6) (-6) (-6)) (V3 3 3 3)Matrix * column vector $V2 (V3 1 2 3) (V3 4 5 6) !* V3 7 8 9 V2 50 122Row vector * matrix "V2 1 2 *! V2 (V3 3 4 5) (V3 6 7 8) V3 15 18 21Scalar-matrix product 5 *!! V2 (V2 1 2) (V2 3 4)V2 (V2 5 10) (V2 15 20)Matrix-scalar product V2 (V2 1 2) (V2 3 4) !!* 5V2 (V2 5 10) (V2 15 20)+Hermitian conjugate or conjugate transpose :adjoint (V2 (V2 (1 :+ 2) (3 :+ 4)) (V2 (5 :+ 6) (7 :+ 8)))LV2 (V2 (1.0 :+ (-2.0)) (5.0 :+ (-6.0))) (V2 (3.0 :+ (-4.0)) (7.0 :+ (-8.0)))$Build a rotation matrix from a unit l. ;Build a transformation matrix from a rotation matrix and a  translation vector. =Build a transformation matrix from a rotation expressed as a  l and a translation vector. AConvert from a 4x3 matrix to a 4x4 matrix, extending it with the  [ 0 0 0 1 ] column vector 8Convert a 3x3 matrix to a 4x4 matrix extending it with 0's in the new row and column. 2x2 identity matrix. eye2V2 (V2 1 0) (V2 0 1)3x3 identity matrix. eye3#V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)4x4 identity matrix. eye46V4 (V4 1 0 0 0) (V4 0 1 0 0) (V4 0 0 1 0) (V4 0 0 0 1)@Extract the translation vector (first three entries of the last # column) from a 3x4 or 4x4 matrix.    :: (R4 v, R3 t) => Lens' (t (v a)) (/ a) 2x2 matrix determinant. det22 (V2 (V2 a b) (V2 c d)) a * d - b * c3x3 matrix determinant. +det33 (V3 (V3 a b c) (V3 d e f) (V3 g h i))?a * (e * i - f * h) - d * (b * i - c * h) + g * (b * f - c * e)2x2 matrix inverse. inv22 $ V2 (V2 1 2) (V2 3 4))Just (V2 (V2 (-2.0) 1.0) (V2 1.5 (-0.5)))3x3 matrix inverse. +inv33 $ V3 (V3 1 2 4) (V3 4 2 2) (V3 1 1 1)JJust (V3 (V3 0.0 0.5 (-1.0)) (V3 (-0.5) (-0.75) 3.5) (V3 0.5 0.25 (-1.5)))|}~yz{|}~~}|yz{|}~portable provisionalEdward Kmett <ekmett@gmail.com> Trustworthy?A handy wrapper to help distinguish points from vectors at the  type level ;An affine space is roughly a vector space in which we have = forgotten or at least pretend to have forgotten the origin.  a .+^ (b .-. a) = b@ & (a .+^ u) .+^ v = a .+^ (u ^+^ v)@ & (a .-. b) ^+^ v = (a .+^ v) .-. q@ :Get the difference between two points as a vector offset.  Add a vector offset to a point. 'Subtract a vector offset from a point. ECompute the quadrance of the difference (the square of the distance) /Distance between two points in an affine space Vector spaces have origins.   non-portable experimentalEdward Kmett <ekmett@gmail.com> Safe-Inferredj  !"#$%&'()*+,-./0123456789:cdefghijklmnopqrstuvwxyz{|}~ !"#$%&'()*+,-./01234567899:;<< = > ? @ @ A B C D E E F G H I J K K L M N O P Q R S T U V V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l mnopqrstu v wxyz{|}~                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G HIJK L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a bcndefghijklmnopqrstu v w x y z { | } ~        linear-1.3.1Linear.V Linear.Binary Linear.VectorLinear.Epsilon Linear.Metric Linear.Core Linear.V0 Linear.V1 Linear.V2 Linear.V3 Linear.V4Linear.PluckerLinear.ConjugateLinear.Quaternion Linear.Trace Linear.Matrix Linear.AffineLinear.Instances Control.LensLensinsideLinearreflection-1.3.2Data.Reflectionint putLinear getLinearAdditivezero^+^^-^lerpliftU2liftI2negatedsumV*^^*^/basisbasisFor kroneckerouterEpsilonnearZeroMetricdot quadranceqddistancenormsignorm normalizeCorecoreincoreV0R1_xV1R2_y_xyV2perpR3_z_xyzV3crosstripleR4_w_xyzwV4vectorpointnormalizePoint CoincidesRayLineLinePassCounterclockwise ClockwiseCoplanarPluckerplucker plucker3Dp01p02p03p23p31p12p10p20p30p32p13p21 squaredError>< isotropic intersectspassesparallelquadranceToOriginclosestToOriginisLineVtoVectorDim reflectDimdimreifyDim reifyVector fromVector Conjugate conjugate Hamiltonian_j_k_ijk Complicated_e_i Quaternionabsipowasinqacosqatanqasinhqacoshqatanhqslerprotate axisAngleTracetracediagonalM43M44M33M22!*!!+!!-!!**!*!!!!*adjointfromQuaternionmkTransformationMatmkTransformation m43_to_m44 m33_to_m44eye2eye3eye4 translationdet22det33inv22inv33PointPAffineDiff.-..+^.-^qdA distanceAorigin$fTraversable1Complex$fFoldable1Complex$fTraversableComplex$fFoldableComplex$fMonadComplex $fBindComplex$fApplicativeComplex$fApplyComplex$fFunctorComplex $fBindHashMap$fApplyHashMapbaseControl.ApplicativeliftA2containers-0.5.0.0 Data.Map.Base unionWithintersectionWith GAdditivegzerogliftU2gliftI2 setElement$fAdditiveIdentity$fAdditiveComplex$fAdditive(->)$fAdditiveHashMap $fAdditiveMap$fAdditiveIntMap $fAdditive[]$fAdditiveMaybe$fAdditiveVector$fAdditiveZipList$fGAdditivePar1 $fGAdditiveM1$fGAdditiveRec1$fGAdditive:*: $fGAdditiveU1$fEpsilonCDoubleGHC.Numabsghc-prim GHC.Classes<=$fEpsilonCFloat$fEpsilonDouble$fEpsilonFloat$fMetricVector$fMetricHashMap $fMetricMap$fMetricIntMap$fMetricIdentityGHC.BaseFunctorContextpeekposview$fFunctorContext $fStorableV0 $fEpsilonV0$fDistributiveV0$fCoreV0 $fMetricV0$fFractionalV0$fNumV0 $fMonadV0$fBindV0 $fAdditiveV0$fApplicativeV0 $fApplyV0$fTraversableV0 $fFoldableV0 $fFunctorV0$fIxV1$fDistributiveV1$fCoreV1 $fR1Identity$fR1V1 $fMetricV1$fFractionalV1$fNumV1 $fMonadV1$fBindV1 $fAdditiveV1$fApplicativeV1 $fApplyV1$fTraversable1V1 $fFoldable1V1$fIxV2 $fStorableV2 $fEpsilonV2$fDistributiveV2$fCoreV2$fR2V2$fR1V2 $fMetricV2$fFractionalV2$fNumV2 $fMonadV2$fBindV2 $fAdditiveV2$fApplicativeV2 $fApplyV2$fTraversable1V2 $fFoldable1V2$fTraversableV2 $fFoldableV2 $fFunctorV2$fIxV3 $fEpsilonV3 $fStorableV3$fCoreV3$fR3V3$fR2V3$fR1V3$fDistributiveV3 $fMetricV3$fFractionalV3$fNumV3 $fMonadV3$fBindV3 $fAdditiveV3$fApplicativeV3 $fApplyV3$fTraversable1V3 $fFoldable1V3$fTraversableV3 $fFoldableV3 $fFunctorV3$fIxV4 $fEpsilonV4 $fStorableV4$fCoreV4$fR4V4$fR3V4$fR2V4$fR1V4$fDistributiveV4 $fMetricV4$fFractionalV4$fNumV4 $fMonadV4$fBindV4 $fAdditiveV4 $fApplyV4$fApplicativeV4$fTraversable1V4 $fFoldable1V4$fTraversableV4 $fFoldableV4 $fFunctorV4EqNum==toUV coincides coincides'anti $fEqCoincides$fEpsilonPlucker$fMetricPlucker$fStorablePlucker$fFractionalPlucker $fNumPlucker $fIxPlucker$fTraversable1Plucker$fFoldable1Plucker$fTraversablePlucker$fFoldablePlucker $fCorePlucker$fDistributivePlucker$fMonadPlucker $fBindPlucker$fAdditivePlucker$fApplicativePlucker$fApplyPlucker$fFunctorPlucker ReifiedDimretagDim $fMetricV $fEpsilonV $fStorableV$fDistributiveV$fCoreV $fFractionalV$fNumV $fAdditiveV$fMonadV$fBindV$fApplicativeV$fApplyV$fTraversableV $fFoldableV $fFunctorV$fDimV$fDimReifiedDim$fConjugateComplex$fConjugateCDouble$fConjugateCFloat$fConjugateFloat$fConjugateDouble$fConjugateWord8$fConjugateWord16$fConjugateWord32$fConjugateWord64$fConjugateWord$fConjugateInt8$fConjugateInt16$fConjugateInt32$fConjugateInt64$fConjugateInt$fConjugateIntegerqicutcutWith GHC.FloatasinacosatanasinhacoshatanhqNaN reimagine$fEpsilonQuaternion$fFloatingQuaternion$fConjugateQuaternion$fDistributiveQuaternion$fHamiltonianQuaternion$fComplicatedQuaternion$fComplicatedComplex$fMetricQuaternion$fFractionalQuaternion$fNumQuaternion$fStorableQuaternion$fTraversableQuaternion$fFoldableQuaternion$fCoreQuaternion$fIxQuaternion$fMonadQuaternion$fBindQuaternion$fAdditiveQuaternion$fApplicativeQuaternion$fApplyQuaternion$fFunctorQuaternion$fTraceCompose$fTraceProduct$fTraceComplex$fTraceQuaternion$fTracePlucker $fTraceV4 $fTraceV3 $fTraceV2 $fTraceV0$fTraceV$fTraceHashMap $fTraceMap $fTraceIntMap $fAffinePoint $fAffineV$fAffineHashMap $fAffineMap $fAffine(->)$fAffineQuaternion$fAffinePlucker $fAffineV4 $fAffineV3 $fAffineV2 $fAffineV1 $fAffineV0$fAffineVector$fAffineIdentity$fAffineIntMap $fAffineMaybe$fAffineZipList$fAffineComplex $fAffine[]