g      !"#$%&'()*+,-./0123456789:; < = > ? @ 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 [ \ ] ^ _ ` a b c d e f portable provisionalEdward Kmett <ekmett@gmail.com> Safe-InferredCompute the sum of two vectors V2 1 2 ^+^ V2 3 4V2 4 6!Compute the negation of a vector gnegate (V2 2 4) V2 (-2) (-4)+Compute the difference between two vectors V2 4 5 - V2 3 1V2 1 4 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. *Linearly interpolate between 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. g h a i 1e-12j h a i 1e-6gjgj non-portable experimentalEdward Kmett <ekmett@gmail.com> Safe-Inferred A free inner product/ metric space ;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 411 9Compute 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 k 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 k,  that is to say x = Rep f is a valid choice of x for (nearly) every   Representable k.  non-portable experimentalEdward Kmett <ekmett@gmail.com>None6A space that distinguishes 2 orthogonal basis vectors  and , but may have more.  V2 1 2 ^._x1V2 1 2 & _x .~ 3V2 3 2 V2 1 2 ^._y2V2 1 2 & _y .~ 3V2 1 3A 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) 10lmnopqrstuvwxylmnopqrstuvwxy non-portable experimentalEdward Kmett <ekmett@gmail.com>None7A space that distinguishes 3 orthogonal basis vectors: , , and . (It may have more) A 3-dimensional vector cross product scalar triple product  z{|}~    z{|}~ non-portable experimentalEdward Kmett <ekmett@gmail.com>None!4A space that distinguishes orthogonal basis vectors , , , ". (It may have more.) $A 4-dimensional vector. &OConvert a 3-dimensional affine vector into a 4-dimensional homogeneous vector. 'NConvert a 3-dimensional affine point into a 4-dimensional homogeneous vector. !"#$%&'!"#$%&'$%&'!"#!"#$%&' non-portable experimentalEdward Kmett <ekmett@gmail.com>None(8Plcker coordinates for lines in a 3-dimensional space. *[Given a pair of points represented by homogeneous coordinates generate Plcker coordinates  for the line through them. +OThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). ,OThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). -OThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). .OThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). /OThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). 0OThese elements form a basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). 1ZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). 2ZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). 3ZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). 4ZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). 5ZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). 6ZThese elements form an alternate basis for the Plcker space, or the Grassmanian manifold Gr(2,V4). 7Valid Plcker coordinates p will have 7 p  0 PThat said, floating point makes a mockery of this claim, so you may want to use . 8This isn'Yt th actual metric because this bilinear form gives rise to an isotropic quadratic space 9rChecks if the line is near-isotropic (isotropic vectors in this quadratic space represent lines in real 3d space) ::Checks if the two vectors intersect (or nearly intersect) !()*+,-./0123456789:()*+,-./0123456789:()798*:+,-10526.3/4 ()*+,-./0123456789:  non-portable experimentalEdward Kmett <ekmett@gmail.com> Safe-Inferred;An involutive ring <<Conjugate a value. This defaults to the trivial involution. conjugate (1 :+ 2) 1.0 :+ (-2.0) conjugate 11;<;<;<;<  non-portable experimentalEdward Kmett <ekmett@gmail.com>None=0A vector space that includes the basis elements B, C, > and ? A0A vector space that includes the basis elements B and C D Quaternions %quadrance of the imaginary component F norm of the imaginary component Graise a D to a scalar power 1Helper for calculating with specific branch cuts 1Helper for calculating with specific branch cuts H with a specified branch cut. I with a specified branch cut. J with a specified branch cut. K with a specified branch cut. L with a specified branch cut. M with a specified branch cut. N8Spherical linear interpolation between two quaternions. OApply a rotation to a vector. PP axis theta builds a D representing a  rotation of theta radians about axis. +=>?@ABCDEFGHIJKLMNOP=>?@ABCDEFGHIJKLMNOPDEABC=>?@NHIJKLMFGOP%=>?@ABCDEFGHIJKLMNOP  non-portable experimentalEdward Kmett <ekmett@gmail.com>NoneQ+A 4x3 matrix with row-major representation R+A 4x4 matrix with row-major representation S+A 3x3 matrix with row-major representation T+A 2x2 matrix with row-major representation UMatrix product :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)VMatrix * column vector $V2 (V3 1 2 3) (V3 4 5 6) !* V3 7 8 9 V2 50 122WRow vector * matrix "V2 1 2 *! V2 (V3 3 4 5) (V3 6 7 8) V3 15 18 21XScalar-matrix product 5 *!! V2 (V2 1 2) (V2 3 4)V2 (V2 5 10) (V2 15 20)YMatrix-scalar product V2 (V2 1 2) (V2 3 4) !!* 5V2 (V2 5 10) (V2 15 20)Z+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)))[Compute the trace of a matrix trace (V2 (V2 a b) (V2 c d))a + d\$Build a rotation matrix from a unit D. ]=Build a transformation matrix from a rotation expressed as a  D 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. `3x3 identity matrix. eye3#V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)a4x4 identity matrix. eye46V4 (V4 1 0 0 0) (V4 0 1 0 0) (V4 0 0 1 0) (V4 0 0 0 1)b@Extract the translation vector (first three entries of the last " column) from a 3x4 or 4x4 matrix c2x2 matrix determinant. det22 (V2 (V2 a b) (V2 c d)) a * d - b * cd3x3 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)e2x2 matrix inverse. inv22 $ V2 (V2 1 2) (V2 3 4))Just (V2 (V2 (-2.0) 1.0) (V2 1.5 (-0.5)))f3x3 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)))QRSTUVWXYZ[\]^_`abcdefQRSTUVWXYZ[\]^_`abcdefUVWYXZTSRQ_^cdef`a[b\]QRSTUVWXYZ[\]^_`abcdef  non-portable experimentalEdward Kmett <ekmett@gmail.com>Noneg  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef  !"#$$%&'())*+,-.//01223456789:;<=>?@ABC D E F G H I J K L M M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m nopqrstuvpwxyz{|}~st pppppp linear-0.6 Linear.VectorLinear.Epsilon Linear.Metric Linear.Core Linear.V2 Linear.V3 Linear.V4Linear.PluckerLinear.ConjugateLinear.Quaternion Linear.MatrixLinear^+^gnegate^-^*^^*^/lerpEpsilonnearZeroMetricdot quadranceqddistancenormsignorm normalizeCorecoreR2_x_y_xyV2perpR3_z_xyzV3crosstripleR4_w_xyzwV4vectorpointPluckerpluckerp01p02p03p23p31p12p10p20p30p32p13p21 squaredError>< isotropic intersects Conjugate conjugate Hamiltonian_j_k_ijk Complicated_e_i Quaternionabsipowasinqacosqatanqasinhqacoshqatanhqslerprotate axisAngleM43M44M33M22!*!!**!*!!!!*adjointtracefromQuaternionmkTransformation m43_to_m44 m33_to_m44eye3eye4 translationdet22det33inv22inv33$fEpsilonDoublebaseGHC.Numabsghc-prim GHC.Classes<=$fEpsilonFloatGHC.BaseFunctor$fIxV2 $fStorableV2 $fEpsilonV2$fDistributiveV2$fCoreV2$fR2V2 $fMetricV2$fFractionalV2$fNumV2 $fMonadV2$fApplicativeV2$fTraversableV2 $fFoldableV2 $fFunctorV2$fIxV3 $fEpsilonV3 $fStorableV3$fCoreV3$fR3V3$fR2V3$fDistributiveV3 $fMetricV3$fFractionalV3$fNumV3 $fMonadV3$fApplicativeV3$fTraversableV3 $fFoldableV3 $fFunctorV3$fIxV4 $fEpsilonV4 $fStorableV4$fCoreV4$fR4V4$fR3V4$fR2V4$fDistributiveV4 $fMetricV4$fFractionalV4$fNumV4 $fMonadV4$fApplicativeV4$fTraversableV4 $fFoldableV4 $fFunctorV4==anti$fEpsilonPlucker$fMetricPlucker$fStorablePlucker$fFractionalPlucker $fNumPlucker $fIxPlucker$fTraversablePlucker$fFoldablePlucker $fCorePlucker$fDistributivePlucker$fMonadPlucker$fApplicativePlucker$fFunctorPlucker$fConjugateComplex$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$fApplicativeQuaternion$fFunctorQuaternionmkTransformationMat