packages feed

manifolds-core 0.4.4.0 → 0.4.5.0

raw patch · 4 files changed

+163/−30 lines, 4 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Math.Manifold.Core.PseudoAffine: BoundarylessWitness :: BoundarylessWitness m
- Math.Manifold.Core.PseudoAffine: PseudoAffineWitness :: SemimanifoldWitness x -> PseudoAffineWitness x
- Math.Manifold.Core.PseudoAffine: SemimanifoldWitness :: BoundarylessWitness (Interior x) -> SemimanifoldWitness x
- Math.Manifold.Core.PseudoAffine: class AdditiveGroup (Needle x) => Semimanifold x where type family Needle x :: * type family Interior x :: * Needle x = GenericNeedle x Interior x = x (.+~^) = addvp where addvp :: forall x. Semimanifold x => Interior x -> Needle x -> x addvp p = fromInterior . tp p where (Tagged tp) = translateP :: Tagged x (Interior x -> Needle x -> Interior x) fromInterior p = p .+~^ zeroV toInterior p = fmap GenericInterior $ toInterior (from p :: VRep x) translateP = Tagged $ case translateP :: Tagged (VRep x) (Interior (VRep x) -> Needle (VRep x) -> Interior (VRep x)) of { Tagged tp -> \ (GenericInterior p) (GenericNeedle v) -> GenericInterior $ tp p v } p .-~^ v = p .+~^ negateV v semimanifoldWitness = SemimanifoldWitness BoundarylessWitness
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Constructor Math.Manifold.Core.PseudoAffine.C1_0GenericInterior
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Constructor Math.Manifold.Core.PseudoAffine.C1_0GenericNeedle
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Constructor Math.Manifold.Core.PseudoAffine.C1_0InteriorProductSpace
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Constructor Math.Manifold.Core.PseudoAffine.C1_0NeedleProductSpace
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Datatype Math.Manifold.Core.PseudoAffine.D1GenericInterior
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Datatype Math.Manifold.Core.PseudoAffine.D1GenericNeedle
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Datatype Math.Manifold.Core.PseudoAffine.D1InteriorProductSpace
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Datatype Math.Manifold.Core.PseudoAffine.D1NeedleProductSpace
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Selector Math.Manifold.Core.PseudoAffine.S1_0_0GenericInterior
- Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Selector Math.Manifold.Core.PseudoAffine.S1_0_0GenericNeedle
- Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.PseudoAffine Math.Manifold.Core.Types.D¹
- Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.PseudoAffine Math.Manifold.Core.Types.S¹
- Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.PseudoAffine Math.Manifold.Core.Types.S⁰
- Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.Semimanifold Math.Manifold.Core.Types.D¹
- Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.Semimanifold Math.Manifold.Core.Types.S¹
- Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.Semimanifold Math.Manifold.Core.Types.S⁰
- Math.Manifold.Core.Types: S¹ :: Double -> S¹
- Math.Manifold.Core.Types: instance GHC.Classes.Eq Math.Manifold.Core.Types.S⁰
- Math.Manifold.Core.Types: instance GHC.Show.Show Math.Manifold.Core.Types.D¹
- Math.Manifold.Core.Types: instance GHC.Show.Show Math.Manifold.Core.Types.S¹
- Math.Manifold.Core.Types: instance GHC.Show.Show Math.Manifold.Core.Types.S⁰
- Math.Manifold.Core.Types: type ℝP¹ = S¹
+ Math.Manifold.Core.PseudoAffine: FibreBundle :: !(Interior b) -> !f -> FibreBundle b f
+ Math.Manifold.Core.PseudoAffine: [BoundarylessWitness] :: (Semimanifold m, Interior m ~ m) => BoundarylessWitness m
+ Math.Manifold.Core.PseudoAffine: [PseudoAffineWitness] :: (PseudoAffine (Interior x), PseudoAffine (Needle x)) => SemimanifoldWitness x -> PseudoAffineWitness x
+ Math.Manifold.Core.PseudoAffine: [SemimanifoldWitness] :: (Semimanifold (Needle x), Needle (Interior x) ~ Needle x, Needle (Needle x) ~ Needle x, Interior (Needle x) ~ Needle x) => BoundarylessWitness (Interior x) -> SemimanifoldWitness x
+ Math.Manifold.Core.PseudoAffine: [baseSpace] :: FibreBundle b f -> !(Interior b)
+ Math.Manifold.Core.PseudoAffine: [fibreSpace] :: FibreBundle b f -> !f
+ Math.Manifold.Core.PseudoAffine: class AdditiveGroup (Needle x) => Semimanifold x where {
+ Math.Manifold.Core.PseudoAffine: data FibreBundle b f
+ Math.Manifold.Core.PseudoAffine: instance (GHC.Show.Show (Math.Manifold.Core.PseudoAffine.Interior b), GHC.Show.Show f) => GHC.Show.Show (Math.Manifold.Core.PseudoAffine.FibreBundle b f)
+ Math.Manifold.Core.PseudoAffine: instance GHC.Generics.Generic (Math.Manifold.Core.PseudoAffine.FibreBundle b f)
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.PseudoAffine Math.Manifold.Core.Types.Internal.D¹
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.PseudoAffine Math.Manifold.Core.Types.Internal.S¹
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.PseudoAffine Math.Manifold.Core.Types.Internal.S⁰
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.PseudoAffine Math.Manifold.Core.Types.Internal.ℝP¹
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.PseudoAffine Math.Manifold.Core.Types.Internal.ℝP⁰
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.Semimanifold Math.Manifold.Core.Types.Internal.D¹
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.Semimanifold Math.Manifold.Core.Types.Internal.S¹
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.Semimanifold Math.Manifold.Core.Types.Internal.S⁰
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.Semimanifold Math.Manifold.Core.Types.Internal.ℝP¹
+ Math.Manifold.Core.PseudoAffine: instance Math.Manifold.Core.PseudoAffine.Semimanifold Math.Manifold.Core.Types.Internal.ℝP⁰
+ Math.Manifold.Core.PseudoAffine: toUnitrange :: ℝ -> ℝ
+ Math.Manifold.Core.PseudoAffine: toℝP¹range :: ℝ -> ℝ
+ Math.Manifold.Core.PseudoAffine: type Interior x = x;
+ Math.Manifold.Core.PseudoAffine: type Needle x = GenericNeedle x;
+ Math.Manifold.Core.PseudoAffine: type TangentBundle m = FibreBundle m (Needle m)
+ Math.Manifold.Core.PseudoAffine: type family Interior x :: *;
+ Math.Manifold.Core.PseudoAffine: }
+ Math.Manifold.Core.Types: CD¹ :: !Double -> !x -> CD¹ x
+ Math.Manifold.Core.Types: Cℝay :: !Double -> !x -> Cℝay x
+ Math.Manifold.Core.Types: D²Polar :: !Double -> !Double -> D²
+ Math.Manifold.Core.Types: HemisphereℝP²Polar :: !Double -> !Double -> ℝP²
+ Math.Manifold.Core.Types: HemisphereℝP¹Polar :: Double -> ℝP¹
+ Math.Manifold.Core.Types: S²Polar :: !Double -> !Double -> S²
+ Math.Manifold.Core.Types: S¹Polar :: Double -> S¹
+ Math.Manifold.Core.Types: [hParamCD¹] :: CD¹ x -> !Double
+ Math.Manifold.Core.Types: [hParamCℝay] :: Cℝay x -> !Double
+ Math.Manifold.Core.Types: [pParamCD¹] :: CD¹ x -> !x
+ Math.Manifold.Core.Types: [pParamCℝay] :: Cℝay x -> !x
+ Math.Manifold.Core.Types: [rParamD²] :: D² -> !Double
+ Math.Manifold.Core.Types: [φParamD²] :: D² -> !Double
+ Math.Manifold.Core.Types: [φParamS²] :: S² -> !Double
+ Math.Manifold.Core.Types: [φParamℝP²] :: ℝP² -> !Double
+ Math.Manifold.Core.Types: [φParamℝP¹] :: ℝP¹ -> Double
+ Math.Manifold.Core.Types: [ϑParamS²] :: S² -> !Double
+ Math.Manifold.Core.Types: [ϑParamℝP²] :: ℝP² -> !Double
+ Math.Manifold.Core.Types: data CD¹ x
+ Math.Manifold.Core.Types: data Cℝay x
+ Math.Manifold.Core.Types: data D²
+ Math.Manifold.Core.Types: data S²
+ Math.Manifold.Core.Types: data ℝP²
+ Math.Manifold.Core.Types: data ℝP⁰
+ Math.Manifold.Core.Types: newtype ℝP¹
+ Math.Manifold.Core.Types: ℝPZero :: ℝP⁰
- Math.Manifold.Core.PseudoAffine: alerpB :: (AffineSpace x, VectorSpace (Diff x), Scalar (Diff x) ~ ℝ) => x -> x -> D¹ -> x
+ Math.Manifold.Core.PseudoAffine: alerpB :: forall x. (AffineSpace x, VectorSpace (Diff x), Scalar (Diff x) ~ ℝ) => x -> x -> D¹ -> x
- Math.Manifold.Core.PseudoAffine: class Semimanifold x => PseudoAffine x where p .-~. q = return $ p .-~! q p .-~! q = case p .-~. q of { Just v -> v Nothing -> error "Attempt to calculate vector between points on disjoint manifold-regions." } pseudoAffineWitness = PseudoAffineWitness semimanifoldWitness
+ Math.Manifold.Core.PseudoAffine: class Semimanifold x => PseudoAffine x
- Math.Manifold.Core.PseudoAffine: palerp :: (PseudoAffine x, VectorSpace (Needle x)) => x -> x -> Maybe (Scalar (Needle x) -> x)
+ Math.Manifold.Core.PseudoAffine: palerp :: forall x. (PseudoAffine x, VectorSpace (Needle x)) => x -> x -> Maybe (Scalar (Needle x) -> x)
- Math.Manifold.Core.PseudoAffine: palerpB :: (PseudoAffine x, VectorSpace (Needle x), Scalar (Needle x) ~ ℝ) => x -> x -> Maybe (D¹ -> x)
+ Math.Manifold.Core.PseudoAffine: palerpB :: forall x. (PseudoAffine x, VectorSpace (Needle x), Scalar (Needle x) ~ ℝ) => x -> x -> Maybe (D¹ -> x)
- Math.Manifold.Core.PseudoAffine: pseudoAffineWitness :: PseudoAffine x => PseudoAffineWitness x
+ Math.Manifold.Core.PseudoAffine: pseudoAffineWitness :: (PseudoAffine x, PseudoAffine (Interior x), PseudoAffine (Needle x)) => PseudoAffineWitness x
- Math.Manifold.Core.PseudoAffine: semimanifoldWitness :: Semimanifold x => SemimanifoldWitness x
+ Math.Manifold.Core.PseudoAffine: semimanifoldWitness :: (Semimanifold x, Semimanifold (Interior x), Semimanifold (Needle x), Interior (Interior x) ~ Interior x, Needle (Interior x) ~ Needle x, Needle (Needle x) ~ Needle x, Interior (Needle x) ~ Needle x) => SemimanifoldWitness x
- Math.Manifold.Core.PseudoAffine: toInterior :: Semimanifold x => x -> Maybe (Interior x)
+ Math.Manifold.Core.PseudoAffine: toInterior :: (Semimanifold x, Generic x, Semimanifold (VRep x), Interior x ~ GenericInterior x) => x -> Maybe (Interior x)
- Math.Manifold.Core.PseudoAffine: translateP :: Semimanifold x => Tagged x (Interior x -> Needle x -> Interior x)
+ Math.Manifold.Core.PseudoAffine: translateP :: (Semimanifold x, Generic x, Semimanifold (VRep x), Interior x ~ GenericInterior x, Needle x ~ GenericNeedle x) => Tagged x (Interior x -> Needle x -> Interior x)

Files

Math/Manifold/Core/PseudoAffine.hs view
@@ -15,6 +15,7 @@ {-# LANGUAGE GADTs                    #-} {-# LANGUAGE DefaultSignatures        #-} {-# LANGUAGE DeriveGeneric            #-}+{-# LANGUAGE StandaloneDeriving       #-} {-# LANGUAGE UnicodeSyntax            #-} {-# LANGUAGE ScopedTypeVariables      #-} {-# LANGUAGE TypeOperators            #-}@@ -209,6 +210,18 @@       +-- | A fibre bundle combines points in the /base space/ @b@ with points in the /fibre/+--   @f@. The type @FibreBundle b f@ is thus isomorphic to the tuple space @(b,f)@, but+--   it can have a different topology, the prime example being 'TangentBundle', where+--   nearby points may have differently-oriented tangent spaces.+data FibreBundle b f = FibreBundle+      { baseSpace :: !(Interior b)+      , fibreSpace :: !f+      } deriving (Generic)+deriving instance (Show (Interior b), Show f) => Show (FibreBundle b f)++-- | Points on a manifold, combined with vectors in the respective tangent space.+type TangentBundle m = FibreBundle m (Needle m)     @@ -340,14 +353,12 @@   fromInterior = id   toInterior = pure   translateP = Tagged (.+~^)-  S¹ φ₀ .+~^ δφ-     | φ' < 0     = S¹ $ φ' + tau-     | otherwise  = S¹ $ φ'+  S¹Polar φ₀ .+~^ δφ  = S¹Polar $ φ'    where φ' = toS¹range $ φ₀ + δφ instance PseudoAffine S¹ where-  S¹ φ₁ .-~. S¹ φ₀-     | δφ > pi     = pure (δφ - 2*pi)-     | δφ < (-pi)  = pure (δφ + 2*pi)+  S¹Polar φ₁ .-~. S¹Polar φ₀+     | δφ > pi     = pure (δφ - tau)+     | δφ < (-pi)  = pure (δφ + tau)      | otherwise   = pure δφ    where δφ = φ₁ - φ₀ @@ -367,16 +378,45 @@   +instance Semimanifold ℝP⁰ where+  type Needle ℝP⁰ = ZeroDim ℝ+  fromInterior = id+  toInterior = pure+  translateP = Tagged (.+~^)+  p .+~^ Origin = p+  p .-~^ Origin = p+instance PseudoAffine ℝP⁰ where+  ℝPZero .-~. ℝPZero = pure Origin +instance Semimanifold ℝP¹ where+  type Needle ℝP¹ = ℝ+  fromInterior = id+  toInterior = pure+  translateP = Tagged (.+~^)+  HemisphereℝP¹Polar r₀ .+~^ δr = HemisphereℝP¹Polar . toℝP¹range $ r₀ + δr+instance PseudoAffine ℝP¹ where+  HemisphereℝP¹Polar φ₁ .-~. HemisphereℝP¹Polar φ₀+     | δφ > pi/2     = pure (δφ - pi)+     | δφ < (-pi/2)  = pure (δφ + pi)+     | otherwise     = pure δφ+   where δφ = φ₁ - φ₀    ++ tau :: ℝ tau = 2 * pi  toS¹range :: ℝ -> ℝ toS¹range φ = (φ+pi)`mod'`tau - pi++toℝP¹range :: ℝ -> ℝ+toℝP¹range φ = (φ+pi/2)`mod'`pi - pi/2++toUnitrange :: ℝ -> ℝ+toUnitrange φ = (φ+1)`mod'`2 - 1   
Math/Manifold/Core/Types.hs view
@@ -13,10 +13,19 @@   {-# LANGUAGE TypeFamilies             #-}+{-# LANGUAGE PatternSynonyms          #-}+{-# LANGUAGE ViewPatterns             #-}  -module Math.Manifold.Core.Types where+module Math.Manifold.Core.Types+        ( ℝ⁰, ℝ+        , S⁰(..), otherHalfSphere, S¹(..), pattern S¹, S²(..), pattern S²+        , D¹(..), fromIntv0to1, D²(..), pattern D²+        , ℝP⁰(..), ℝP¹(..), pattern ℝP¹, ℝP²(..), pattern ℝP²+        , Cℝay(..), CD¹(..)+        ) where +import Math.Manifold.Core.Types.Internal  import Data.VectorSpace import Math.Manifold.VectorSpace.ZeroDimensional@@ -25,45 +34,41 @@ import Data.Void import Data.Monoid -import Control.Applicative (Const(..), Alternative(..))    --- | The zero-dimensional sphere is actually just two points. Implementation might---   therefore change to @ℝ⁰ 'Control.Category.Constrained.+' ℝ⁰@: the disjoint sum of two---   single-point spaces.-data S⁰ = PositiveHalfSphere | NegativeHalfSphere deriving(Eq, Show)- otherHalfSphere :: S⁰ -> S⁰ otherHalfSphere PositiveHalfSphere = NegativeHalfSphere otherHalfSphere NegativeHalfSphere = PositiveHalfSphere --- | The unit circle.-newtype S¹ = S¹ { φParamS¹ :: Double -- ^ Must be in range @[-π, π[@.-                } deriving (Show)--+{-# DEPRECATED S¹ "Use Math.Manifold.Core.Types.S¹Polar" #-}+pattern S¹ :: Double -> S¹+pattern S¹ φ = S¹Polar φ +{-# DEPRECATED ℝP¹ "Use Math.Manifold.Core.Types.HemisphereℝP¹Polar (notice: different range)" #-}+pattern ℝP¹ :: Double -> ℝP¹+pattern ℝP¹ r <- (HemisphereℝP¹Polar ((2/pi*)->r))+ where ℝP¹ r = HemisphereℝP¹Polar $ r * pi/2 -type ℝP¹ = S¹+{-# DEPRECATED S² "Use Math.Manifold.Core.Types.S²Polar" #-}+pattern S² :: Double -> Double -> S²+pattern S² ϑ φ = S²Polar ϑ φ +{-# DEPRECATED ℝP² "Use Math.Manifold.Core.Types.HemisphereℝP²Polar (notice: different range)" #-}+pattern ℝP² :: Double -> Double -> ℝP²+pattern ℝP² r φ <- (HemisphereℝP²Polar ((2/pi*)->r) φ)+ where ℝP² r φ = HemisphereℝP²Polar (r * pi/2) φ +{-# DEPRECATED D² "Use Math.Manifold.Core.Types.D²Polar" #-}+pattern D² :: Double -> Double -> D²+pattern D² r φ = D²Polar r φ  --- | The &#x201c;one-dimensional disk&#x201d; &#x2013; really just the line segment between---   the two points -1 and 1 of 'S⁰', i.e. this is simply a closed interval.-newtype D¹ = D¹ { xParamD¹ :: Double -- ^ Range @[-1, 1]@.-                } deriving (Show) fromIntv0to1 :: ℝ -> D¹ fromIntv0to1 x | x<0        = D¹ (-1)                | x>1        = D¹ 1                | otherwise  = D¹ $ x*2 - 1----type ℝ = Double-type ℝ⁰ = ZeroDim ℝ   
+ Math/Manifold/Core/Types/Internal.hs view
@@ -0,0 +1,88 @@+-- |+-- Module      : Math.Manifold.Core.Types.Internal+-- Copyright   : (c) Justus Sagemüller 2018+-- License     : GPL v3+-- +-- Maintainer  : (@) jsagemue $ uni-koeln.de+-- Stability   : experimental+-- Portability : portable+-- +-- Several low-dimensional manifolds, represented in some simple way as Haskell+-- data types. All these are in the 'PseudoAffine' class.+-- +++module Math.Manifold.Core.Types.Internal where++import Math.Manifold.VectorSpace.ZeroDimensional++++-- | The zero-dimensional sphere is actually just two points. Implementation might+--   therefore change to @ℝ⁰ 'Control.Category.Constrained.+' ℝ⁰@: the disjoint sum of two+--   single-point spaces.+data S⁰ = PositiveHalfSphere | NegativeHalfSphere deriving(Eq, Show)++data ℝP⁰ = ℝPZero deriving (Eq, Show)++-- | The unit circle.+newtype S¹ = S¹Polar { φParamS¹ :: Double -- ^ Must be in range @[-π, π[@.+                     } deriving (Show)+++newtype ℝP¹ = HemisphereℝP¹Polar { φParamℝP¹ :: Double -- ^ Range @[-π/2,π/2[@.+                                 } deriving (Show)++-- | The ordinary unit sphere.+data S² = S²Polar { ϑParamS² :: !Double -- ^ Range @[0, π[@.+                  , φParamS² :: !Double -- ^ Range @[-π, π[@.+                  } deriving (Show)+++-- | The two-dimensional real projective space, implemented as a disk with+--   opposing points on the rim glued together. Image this disk as the northern hemisphere+--   of a unit sphere; 'ℝP²' is the space of all straight lines passing through+--   the origin of 'ℝ³', and each of these lines is represented by the point at which it+--   passes through the hemisphere.+data ℝP² = HemisphereℝP²Polar { ϑParamℝP² :: !Double -- ^ Range @[0, π/2]@.+                              , φParamℝP² :: !Double -- ^ Range @[-π, π[@.+                              } deriving (Show)+++-- | The standard, closed unit disk. Homeomorphic to the cone over 'S¹', but not in the+--   the obvious, “flat” way. (In is /not/ homeomorphic, despite+--   the almost identical ADT definition, to the projective space 'ℝP²'!)+data D² = D²Polar { rParamD² :: !Double -- ^ Range @[0, 1]@.+                  , φParamD² :: !Double -- ^ Range @[-π, π[@.+                  } deriving (Show)++-- | A (closed) cone over a space @x@ is the product of @x@ with the closed interval 'D¹'+--   of “heights”,+--   except on its “tip”: here, @x@ is smashed to a single point.+--   +--   This construct becomes (homeomorphic-to-) an actual geometric cone (and to 'D²') in the+--   special case @x = 'S¹'@.+data CD¹ x = CD¹ { hParamCD¹ :: !Double -- ^ Range @[0, 1]@+                 , pParamCD¹ :: !x      -- ^ Irrelevant at @h = 0@.+                 } deriving (Show)+++-- | An open cone is homeomorphic to a closed cone without the “lid”,+--   i.e. without the “last copy” of @x@, at the far end of the height+--   interval. Since that means the height does not include its supremum, it is actually+--   more natural to express it as the entire real ray, hence the name.+data Cℝay x = Cℝay { hParamCℝay :: !Double -- ^ Range @[0, ∞[@+                   , pParamCℝay :: !x      -- ^ Irrelevant at @h = 0@.+                   } deriving (Show)++-- | The “one-dimensional disk” – really just the line segment between+--   the two points -1 and 1 of 'S⁰', i.e. this is simply a closed interval.+newtype D¹ = D¹ { xParamD¹ :: Double -- ^ Range @[-1, 1]@.+                } deriving (Show)++type ℝ = Double+type ℝ⁰ = ZeroDim ℝ++++
manifolds-core.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/  name:                manifolds-core-version:             0.4.4.0+version:             0.4.5.0 synopsis:            The basic classes for the manifolds hierarchy. description:         The basic classes for the                      <http://hackage.haskell.org/package/manifolds manifolds> hierarchy.@@ -21,7 +21,7 @@   exposed-modules:     Math.Manifold.Core.Types                        , Math.Manifold.Core.PseudoAffine                        , Math.Manifold.VectorSpace.ZeroDimensional-  -- other-modules:       +  other-modules:       Math.Manifold.Core.Types.Internal   other-extensions:    FlexibleInstances, UndecidableInstances, ExplicitNamespaces, TypeFamilies, FunctionalDependencies, FlexibleContexts, GADTs, RankNTypes, TupleSections, ConstraintKinds, PatternGuards, TypeOperators, ScopedTypeVariables, RecordWildCards, DataKinds, StandaloneDeriving, DefaultSignatures, UnicodeSyntax, MultiWayIf   build-depends:       base >=4.5 && <5                        , vector-space >=0.11