diff --git a/Data/LinearMap/HerMetric.hs b/Data/LinearMap/HerMetric.hs
--- a/Data/LinearMap/HerMetric.hs
+++ b/Data/LinearMap/HerMetric.hs
@@ -267,27 +267,27 @@
 eigenSpan :: (HasMetric v, Scalar v ~ ℝ) => HerMetric' v -> [v]
 eigenSpan (HerMetric' Nothing) = []
 eigenSpan (HerMetric' (Just m)) = map fromPackedVector eigSpan
- where (μs,vsm) = HMat.eigSH m -- TODO: replace with `eigSH'`, which is unchecked
+ where (μs,vsm) = HMat.eigSH' m -- TODO: replace with `eigSH'`, which is unchecked
                                -- (`HerMetric` is always Hermitian!)
        eigSpan = zipWith (HMat.scale . sqrt) (HMat.toList μs) (HMat.toColumns vsm)
 
 eigenSpan' :: (HasMetric v, Scalar v ~ ℝ) => HerMetric v -> [DualSpace v]
 eigenSpan' (HerMetric Nothing) = []
 eigenSpan' (HerMetric (Just m)) = map fromPackedVector eigSpan
- where (μs,vsm) = HMat.eigSH m -- TODO: replace with `eigSH'`, which is unchecked
+ where (μs,vsm) = HMat.eigSH' m -- TODO: replace with `eigSH'`, which is unchecked
                                -- (`HerMetric` is always Hermitian!)
        eigSpan = zipWith (HMat.scale . sqrt) (HMat.toList μs) (HMat.toColumns vsm)
 
 eigenCoSpan :: (HasMetric v, Scalar v ~ ℝ) => HerMetric' v -> [DualSpace v]
 eigenCoSpan (HerMetric' Nothing) = []
 eigenCoSpan (HerMetric' (Just m)) = map fromPackedVector eigSpan
- where (μs,vsm) = HMat.eigSH m -- TODO: replace with `eigSH'`, which is unchecked
+ where (μs,vsm) = HMat.eigSH' m -- TODO: replace with `eigSH'`, which is unchecked
                                -- (`HerMetric` is always Hermitian!)
        eigSpan = zipWith (HMat.scale . recip . sqrt) (HMat.toList μs) (HMat.toColumns vsm)
 eigenCoSpan' :: (HasMetric v, Scalar v ~ ℝ) => HerMetric v -> [v]
 eigenCoSpan' (HerMetric Nothing) = []
 eigenCoSpan' (HerMetric (Just m)) = map fromPackedVector eigSpan
- where (μs,vsm) = HMat.eigSH m -- TODO: replace with `eigSH'`, which is unchecked
+ where (μs,vsm) = HMat.eigSH' m -- TODO: replace with `eigSH'`, which is unchecked
                                -- (`HerMetric` is always Hermitian!)
        eigSpan = zipWith (HMat.scale . recip . sqrt) (HMat.toList μs) (HMat.toColumns vsm)
 
diff --git a/Data/Manifold/PseudoAffine.hs b/Data/Manifold/PseudoAffine.hs
--- a/Data/Manifold/PseudoAffine.hs
+++ b/Data/Manifold/PseudoAffine.hs
@@ -50,7 +50,6 @@
               Manifold
             , Semimanifold(..)
             , PseudoAffine(..)
-            , Metric, Metric', euclideanMetric
             -- * Regions within a manifold
             , Region
             -- * Hierarchy of manifold-categories
@@ -60,7 +59,11 @@
             , PWDiffable
             -- ** Region-wise defined diff'able funcs
             , RWDiffable
-            -- * Helper constraints
+            -- * Type definitions
+            -- ** Metrics
+            , Metric, Metric', euclideanMetric
+            , RieMetric, RieMetric'
+            -- ** Constraints
             , RealDimension, AffineManifold
             , LinearManifold
             , WithField
@@ -68,6 +71,7 @@
             , EuclidSpace
             -- * Misc
             , palerp
+            , discretisePath
             ) where
     
 
@@ -221,9 +225,8 @@
 class (PseudoAffine m, LinearManifold (Needle m), Interior m ~ m) => Manifold m
 instance (PseudoAffine m, LinearManifold (Needle m), Interior m ~ m) => Manifold m
 
-type LocallyScalable s x = ( PseudoAffine x, (Needle x) ~ Needle x
+type LocallyScalable s x = ( PseudoAffine x
                            , HasMetric (Needle x)
-                           , DualSpace (Needle x) ~ DualSpace (Needle x)
                            , s ~ Scalar (Needle x) )
 
 -- | Basically just an &#x201c;updated&#x201d; version of the 'VectorSpace' class.
@@ -273,6 +276,12 @@
 type Metric x = HerMetric (Needle x)
 type Metric' x = HerMetric' (Needle x)
 
+-- | A Riemannian metric assigns each point on a manifold a scalar product on the tangent space.
+--   Note that this association is /not/ continuous, because the charts/tangent spaces in the bundle
+--   are a priori disjoint. However, for a proper Riemannian metric, all arising expressions
+--   of scalar products from needles between points on the manifold ought to be differentiable.
+type RieMetric x = x -> Metric x
+type RieMetric' x = x -> Metric' x
 
 -- | Interpolate between points, approximately linearly. For
 --   points that aren't close neighbours (i.e. lie in an almost
@@ -287,6 +296,25 @@
 palerp p1 p2 = case (fromInterior p2 :: x) .-~. p1 of
   Option (Just v) -> return $ \t -> p1 .+~^ t *^ v
   _ -> Hask.empty
+
+
+
+
+
+discretisePath :: WithField ℝ Manifold x
+      => Int                    -- ^ Limit the number of steps taken in either direction. Note this will not cap the resolution but /length/ of the discretised path.
+      -> RieMetric x            -- ^ Inaccuracy allowance /ε/.
+      -> (Differentiable ℝ ℝ x) -- ^ Path specification.
+      -> [(ℝ,x)]                -- ^ Trail of points along the path, such that a linear interpolation deviates nowhere by more as /ε/.
+discretisePath nLim m (Differentiable f)
+         = reverse (tail . take nLim $ traceFwd 0 (-1)) ++ take nLim (traceFwd 0 1)
+ where traceFwd x₀ dir
+         | abs x₀ > 1e+100  = [(x₀, fx₀)]
+         | otherwise        = (x₀, fx₀) : traceFwd xn dir
+        where (fx₀, _, δx²) = f x₀
+              εx = m fx₀
+              χ = metric (δx² εx) 1
+              xn = x₀ + dir * min (abs x₀+1) (recip χ)
 
 
 
diff --git a/manifolds.cabal b/manifolds.cabal
--- a/manifolds.cabal
+++ b/manifolds.cabal
@@ -1,7 +1,7 @@
 Name:                manifolds
-Version:             0.1.5.0
+Version:             0.1.5.1
 Category:            Math
-Synopsis:            Working with manifolds in a direct, embedding-free way.
+Synopsis:            Coordinate-free hypersurfaces
 Description:         Manifolds, a generalisation of the notion of &#x201c;smooth curves&#x201d; or surfaces,
                      are topological spaces /locally homeomorphic to a vector space/. This gives
                      rise to what is actually the most natural / mathematically elegant way of dealing
