algebraic (empty) → 0.1.0.0
raw patch · 25 files changed
+740/−0 lines, 25 filesdep +basesetup-changed
Dependencies added: base
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- algebraic.cabal +55/−0
- src/Math/Constants.hs +8/−0
- src/Math/Coordinate.hs +23/−0
- src/Math/Coordinate/BiAngular.hs +1/−0
- src/Math/Coordinate/BiPolar.hs +33/−0
- src/Math/Coordinate/BiPolar2Center.hs +35/−0
- src/Math/Coordinate/Cartesian.hs +65/−0
- src/Math/Coordinate/Coordinate.hs +23/−0
- src/Math/Coordinate/Elliptic.hs +36/−0
- src/Math/Coordinate/LogPolar.hs +35/−0
- src/Math/Coordinate/Parabolic.hs +35/−0
- src/Math/Coordinate/Polar.hs +32/−0
- src/Math/Coordinate/UV.hs +57/−0
- src/Math/Linear/Epsilon.hs +37/−0
- src/Math/Metric.hs +11/−0
- src/Math/Metric/Chebyshev.hs +23/−0
- src/Math/Metric/Discrete.hs +23/−0
- src/Math/Metric/Euclidean.hs +21/−0
- src/Math/Metric/Metric.hs +33/−0
- src/Math/Metric/Minkowski.hs +21/−0
- src/Math/Metric/Taxicab.hs +23/−0
- src/Math/Space/MetricSpace.hs +55/−0
- src/Math/Space/Space.hs +23/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2014, Wojciech Danilo++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Wojciech Danilo nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ algebraic.cabal view
@@ -0,0 +1,55 @@+-- Initial algebraic.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/++name: algebraic+version: 0.1.0.0+synopsis: General linear algebra structures.+-- description: +license: BSD3+license-file: LICENSE+author: Wojciech Danilo+maintainer: wojciech.danilo@gmail.com+-- copyright: +category: Math+build-type: Simple+-- extra-source-files: +cabal-version: >=1.10++library+ Hs-Source-Dirs: src+ exposed-modules: Math.Constants, + Math.Coordinate, + Math.Metric, + Math.Linear.Epsilon, + Math.Metric.Euclidean, + Math.Metric.Discrete, + Math.Metric.Taxicab, + Math.Metric.Minkowski, + Math.Metric.Chebyshev, + Math.Metric.Metric, + Math.Coordinate.BiPolar2Center, + Math.Coordinate.Coordinate, + Math.Coordinate.Elliptic, + Math.Coordinate.BiAngular, + Math.Coordinate.LogPolar, + Math.Coordinate.Polar, + Math.Coordinate.Parabolic, + Math.Coordinate.Cartesian, + Math.Coordinate.UV, + Math.Coordinate.BiPolar, + Math.Space.Space, + Math.Space.MetricSpace+ -- other-modules: + default-extensions: MultiParamTypeClasses,+ FlexibleInstances,+ FlexibleContexts+ other-extensions: NoMonomorphismRestriction, + FunctionalDependencies, + GADTs, + UndecidableInstances, + OverlappingInstances, + TypeFamilies, + ConstraintKinds+ build-depends: base >=4.6 && <4.7+ -- hs-source-dirs: + default-language: Haskell2010
+ src/Math/Constants.hs view
@@ -0,0 +1,8 @@+{-# LANGUAGE NoMonomorphismRestriction #-}++module Math.Constants where+ +import qualified Prelude as P++pi = P.pi+e = P.exp 1
+ src/Math/Coordinate.hs view
@@ -0,0 +1,23 @@+---------------------------------------------------------------------------+-- Copyright (C) Flowbox, Inc - All Rights Reserved+-- Unauthorized copying of this file, via any medium is strictly prohibited+-- Proprietary and confidential+-- Flowbox Team <contact@flowbox.io>, 2014+---------------------------------------------------------------------------++module Math.Coordinate (+ module Math.Coordinate,+ module X+) where++import Math.Coordinate.Coordinate as X (convertCoord)+--import Math.Coordinate.BiAngular as X (BiAngular , toBiAngular)+import Math.Coordinate.BiPolar as X (BiPolar , toBiPolar)+import Math.Coordinate.BiPolar2Center as X (BiPolar2Center , toBiPolar2Center)+import Math.Coordinate.Cartesian as X (Cartesian , toCartesian)+import Math.Coordinate.Elliptic as X (Elliptic , toElliptic)+import Math.Coordinate.LogPolar as X (LogPolar , toLogPolar) +import Math.Coordinate.Parabolic as X (Parabolic , toParabolic) +import Math.Coordinate.Polar as X (Polar , toPolar) +import Math.Coordinate.UV as X (UV , toUV) +
+ src/Math/Coordinate/BiAngular.hs view
@@ -0,0 +1,1 @@+module Math.Coordinate.BiAngular where
+ src/Math/Coordinate/BiPolar.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverlappingInstances #-}++module Math.Coordinate.BiPolar where++import qualified Math.Coordinate.Cartesian as Cartesian+import Math.Coordinate.Cartesian (Cartesian)+import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), convertCoord)+import Math.Space.Space (Space2)++data BiPolar a = BiPolar !a deriving (Show)++data Point a = Point { a :: !a+ , sigma :: !a + , tau :: !a + } deriving (Show)++toBiPolar = convertCoord . BiPolar++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance Floating a => CoordConversion ManualConversion Cartesian space (Point a) (Cartesian.Point2 a) where+ convertCoordBase _ _ _ (Point a sigma tau) = Cartesian.Point2 x y where+ x = a * (sinh tau) / (cosh tau - cos sigma)+ y = a * (sin sigma) / (cosh tau - cos sigma)++instance (a~b) => CoordConversion ManualConversion (BiPolar b) space (Cartesian.Point2 a) (Point a) where+ convertCoordBase _ _ _ (Cartesian.Point2 x y) = undefined
+ src/Math/Coordinate/BiPolar2Center.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverlappingInstances #-}++module Math.Coordinate.BiPolar2Center where++import qualified Math.Coordinate.Cartesian as Cartesian+import Math.Coordinate.Cartesian (Cartesian)+import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), convertCoord)+import Math.Space.Space (Space2)++data BiPolar2Center a = BiPolar2Center !a deriving (Show)++data Point a = Point { a :: !a+ , r1 :: !a+ , r2 :: !a+ } deriving (Show)++toBiPolar2Center = convertCoord . BiPolar2Center++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance Floating a => CoordConversion ManualConversion Cartesian space (Point a) (Cartesian.Point2 a) where+ convertCoordBase _ _ _ (Point a r1 r2) = Cartesian.Point2 x y where+ x = (r1**2 - r2**2) / (4*a)+ y = (sqrt $ 16 * a**2 * r1**2 - (r1**2 - r2**2 + 4 * a**2))/(4*a)++instance (Floating a, a~b) => CoordConversion ManualConversion (BiPolar2Center b) space (Cartesian.Point2 a) (Point a) where+ convertCoordBase _ (BiPolar2Center a) _ (Cartesian.Point2 x y) = Point a r1 r2+ where r1 = sqrt $ (a+x)**2 + y**2+ r2 = sqrt $ (x-a)**2 + y**2
+ src/Math/Coordinate/Cartesian.hs view
@@ -0,0 +1,65 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE OverlappingInstances #-}+{-# LANGUAGE TypeFamilies #-}++module Math.Coordinate.Cartesian where++import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), AutoConversion(..), convertCoord)+import Math.Space.Space (Space2)++data Cartesian = Cartesian deriving (Show)++data Point1 a = Point1 !a deriving (Show, Eq)+data Point2 a = Point2 !a !a deriving (Show, Eq)+data Point3 a = Point3 !a !a !a deriving (Show, Eq)+data Point4 a = Point4 !a !a !a !a deriving (Show, Eq)++toCartesian = convertCoord Cartesian++--------------------------------------------------------------------------------+-- Classes+--------------------------------------------------------------------------------++class CartesianCoord1 coord where+ x :: coord a -> a++class CartesianCoord1 coord => CartesianCoord2 coord where+ y :: coord a -> a++class CartesianCoord2 coord => CartesianCoord3 coord where+ z :: coord a -> a++class CartesianCoord3 coord => CartesianCoord4 coord where+ w :: coord a -> a++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance CartesianCoord1 Point1 where x (Point1 x) = x++instance CartesianCoord1 Point2 where x (Point2 x _) = x+instance CartesianCoord2 Point2 where y (Point2 _ y) = y++instance CartesianCoord1 Point3 where x (Point3 x _ _) = x+instance CartesianCoord2 Point3 where y (Point3 _ y _) = y+instance CartesianCoord3 Point3 where z (Point3 _ _ z) = z++instance CartesianCoord1 Point4 where x (Point4 x _ _ _) = x+instance CartesianCoord2 Point4 where y (Point4 _ y _ _) = y+instance CartesianCoord3 Point4 where z (Point4 _ _ z _) = z+instance CartesianCoord4 Point4 where w (Point4 _ _ _ w) = w+++instance ( CoordConversion ManualConversion Cartesian space a b+ , CoordConversion ManualConversion sys space b c) => + CoordConversion AutoConversion sys space a c where+ convertCoordBase _ coord space = (convertCoordBase ManualConversion coord space) . (convertCoordBase ManualConversion Cartesian space)+++instance CoordConversion ManualConversion Cartesian space (Point2 a) (Point2 a) where+ convertCoordBase _ _ _ = id
+ src/Math/Coordinate/Coordinate.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ConstraintKinds #-}++module Math.Coordinate.Coordinate where++import GHC.Exts++-- convType is used to prevent context reduction stack overflow when combining with+-- automatic coordinate conversion+class CoordConversion convType sys space c1 c2 | sys c1 -> c2 where+ convertCoordBase :: convType -> sys -> space -> c1 -> c2+++data ManualConversion = ManualConversion deriving Show+data AutoConversion = AutoConversion deriving Show++--convertCoord :: (CoordConversion AutoConversion sys a b, SpaceOf a space) => +-- sys -> space -> a -> b+convertCoord = convertCoordBase AutoConversion
+ src/Math/Coordinate/Elliptic.hs view
@@ -0,0 +1,36 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverlappingInstances #-}++module Math.Coordinate.Elliptic where++import Data.Complex+import qualified Math.Coordinate.Cartesian as Cartesian+import Math.Coordinate.Cartesian (Cartesian)+import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), convertCoord)+import Math.Space.Space (Space2)++data Elliptic a = Elliptic !a deriving (Show)++data Point a = Point { a :: !a+ , u :: !a+ , v :: !a+ } deriving (Show)++toElliptic = convertCoord . Elliptic++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance Floating a => CoordConversion ManualConversion Cartesian space (Point a) (Cartesian.Point2 a) where+ convertCoordBase _ _ _ (Point a u v) = Cartesian.Point2 x y where+ x = a * (cosh u * cos v)+ y = a * (sinh u * sin v)++instance (Floating a, a~b) => CoordConversion ManualConversion (Elliptic b) space (Cartesian.Point2 a) (Point a) where+ convertCoordBase _ (Elliptic a) _ (Cartesian.Point2 x y) = Point a u v+ where u = acosh $ -sqrt(2)*x / (sqrt $ 1 + x**2 + y**2 - (sqrt $ 4*y**2+ (-1 + x**2 + y**2)**2))+ v = acos $ -sqrt(1 + x**2 + y**2 - (sqrt $ 4*y**2 + (-1 + x**2 + y**2)**2)) / (sqrt 2)
+ src/Math/Coordinate/LogPolar.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverlappingInstances #-}++module Math.Coordinate.LogPolar where++import qualified Math.Coordinate.Cartesian as Cartesian+import Math.Coordinate.Cartesian (Cartesian)+import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), convertCoord)+import Math.Space.Space (Space2)+import qualified Math.Constants as Const++data LogPolar = LogPolar deriving (Show)++data Point2 a = Point2 { rho :: !a+ , phi :: !a+ } deriving (Show)++toLogPolar = convertCoord LogPolar++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance RealFloat a => CoordConversion ManualConversion Cartesian space (Point2 a) (Cartesian.Point2 a) where+ convertCoordBase _ _ _ pt@(Point2 rho phi) = Cartesian.Point2 (base * cos phi) (base * sin phi)+ where base = Const.e**rho+++instance RealFloat a => CoordConversion ManualConversion LogPolar space (Cartesian.Point2 a) (Point2 a) where+ convertCoordBase _ _ _ (Cartesian.Point2 x y) = Point2 rho phi+ where rho = log . sqrt $ (x*x) + (y*y)+ phi = atan2 y x
+ src/Math/Coordinate/Parabolic.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverlappingInstances #-}++module Math.Coordinate.Parabolic where++import qualified Math.Coordinate.Cartesian as Cartesian+import Math.Coordinate.Cartesian (Cartesian)+import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), convertCoord)+import Math.Space.Space (Space2)++data Parabolic = Parabolic deriving (Show)++data Point a = Point { rho :: !a+ , tau :: !a + } deriving (Show)++toParabolic = convertCoord Parabolic++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance Floating a => CoordConversion ManualConversion Cartesian space (Point a) (Cartesian.Point2 a) where+ convertCoordBase _ _ _ (Point rho tau) = Cartesian.Point2 x y where+ x = rho * tau+ y = (rho**2 - tau**2)/2++instance Floating a => CoordConversion ManualConversion Parabolic space (Cartesian.Point2 a) (Point a) where+ convertCoordBase _ _ _ (Cartesian.Point2 x y) = Point rho tau+ where rho = sqrt $ y + (sqrt $ x**2 + y**2)+ tau = x/rho+
+ src/Math/Coordinate/Polar.hs view
@@ -0,0 +1,32 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverlappingInstances #-}++module Math.Coordinate.Polar where++import qualified Math.Coordinate.Cartesian as Cartesian+import Math.Coordinate.Cartesian (Cartesian)+import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), convertCoord)+import Math.Space.Space (Space2)++data Polar = Polar deriving (Show)++data Point2 a = Point2 { r :: !a+ , phi :: !a+ } deriving (Show)++toPolar = convertCoord Polar++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance Floating a => CoordConversion ManualConversion Cartesian space (Point2 a) (Cartesian.Point2 a) where+ convertCoordBase _ _ _ (Point2 r phi) = Cartesian.Point2 (r * cos phi) (r * sin phi)++instance RealFloat a => CoordConversion ManualConversion Polar space (Cartesian.Point2 a) (Point2 a) where+ convertCoordBase _ _ _ (Cartesian.Point2 x y) = Point2 r phi+ where r = sqrt $ (x*x) + (y*y)+ phi = atan2 y x
+ src/Math/Coordinate/UV.hs view
@@ -0,0 +1,57 @@+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverlappingInstances #-}++module Math.Coordinate.UV where++import qualified Math.Coordinate.Cartesian as Cartesian+import Math.Coordinate.Cartesian (Cartesian)+import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), convertCoord)+import qualified Math.Space.Space as Space+import Math.Space.Space (Space2)++data UV = UV deriving (Show)+data UPoint a = UPoint !a deriving (Show)+data UVPoint a = UVPoint !a !a deriving (Show)+data UVWPoint a = UVWPoint !a !a !a deriving (Show)++toUV = convertCoord UV++--------------------------------------------------------------------------------+-- Classes+--------------------------------------------------------------------------------++class UVCoord1 coord where+ u :: coord a -> a++class UVCoord1 coord => UVCoord2 coord where+ v :: coord a -> a++class UVCoord2 coord => UVCoord3 coord where+ w :: coord a -> a++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance UVCoord1 UPoint where u (UPoint u) = u++instance UVCoord1 UVPoint where u (UVPoint u _) = u+instance UVCoord2 UVPoint where v (UVPoint _ v) = v++instance UVCoord1 UVWPoint where u (UVWPoint u _ _) = u+instance UVCoord2 UVWPoint where v (UVWPoint _ v _) = v+instance UVCoord3 UVWPoint where w (UVWPoint _ _ w) = w+++instance (Space2 space, Num a, a~b) => CoordConversion ManualConversion Cartesian (space b) (UVPoint a) (Cartesian.Point2 a) where+ convertCoordBase _ _ space (UVPoint u v) = Cartesian.Point2 (u*w) (v*h)+ where w = Space.width space+ h = Space.height space++instance (Space2 space, Fractional a, a~b) => CoordConversion ManualConversion UV (space b) (Cartesian.Point2 a) (UVPoint a) where+ convertCoordBase _ sys space (Cartesian.Point2 x y) = UVPoint (x/w) (y/h)+ where w = Space.width space+ h = Space.height space
+ src/Math/Linear/Epsilon.hs view
@@ -0,0 +1,37 @@+module Math.Linear.Epsilon+ ( Epsilon(..)+ ) where+import Foreign.C.Types (CFloat, CDouble)++-- | Provides a fairly subjective test to see if a quantity is near zero.+--+-- >>> nearZero (1e-11 :: Double)+-- False+--+-- >>> nearZero (1e-17 :: Double)+-- True+--+-- >>> nearZero (1e-5 :: Float)+-- False+--+-- >>> nearZero (1e-7 :: Float)+-- True+class Num a => Epsilon a where+ -- | Determine if a quantity is near zero.+ nearZero :: a -> Bool++-- | @'abs' a '<=' 1e-6@+instance Epsilon Float where+ nearZero a = abs a <= 1e-6++-- | @'abs' a '<=' 1e-12@+instance Epsilon Double where+ nearZero a = abs a <= 1e-12++-- | @'abs' a '<=' 1e-6@+instance Epsilon CFloat where+ nearZero a = abs a <= 1e-6++-- | @'abs' a '<=' 1e-12@+instance Epsilon CDouble where+ nearZero a = abs a <= 1e-12
+ src/Math/Metric.hs view
@@ -0,0 +1,11 @@+module Math.Metric (+ module X+) where++import Math.Space.MetricSpace as X+import Math.Metric.Metric as X hiding (distance)+import Math.Metric.Chebyshev as X+import Math.Metric.Discrete as X+import Math.Metric.Euclidean as X+import Math.Metric.Minkowski as X+import Math.Metric.Taxicab as X
+ src/Math/Metric/Chebyshev.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}++module Math.Metric.Chebyshev where++import Math.Metric.Metric (Metric(..), MetricCoord(..))+import Math.Coordinate.Cartesian (Cartesian(..), Point2(..))+++data Chebyshev = Chebyshev deriving Show+++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance MetricCoord Chebyshev Cartesian where+ metricCoord _ = Cartesian++instance (Num a, Ord a) => Metric Chebyshev (Point2 a) a where+ distanceBase _ (Point2 x1 y1) (Point2 x2 y2) = max (abs $ x2-x1) (abs $ y2-y1)++
+ src/Math/Metric/Discrete.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}++module Math.Metric.Discrete where++import Math.Metric.Metric (Metric(..), MetricCoord(..))+import Math.Coordinate.Cartesian (Cartesian(..), Point2(..))+++data Discrete = Discrete deriving Show+++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance MetricCoord Discrete Cartesian where+ metricCoord _ = Cartesian++instance (Num a, Eq a) => Metric Discrete (Point2 a) a where+ distanceBase _ p1 p2 = if p1 == p2 then 0 else 1++
+ src/Math/Metric/Euclidean.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}++module Math.Metric.Euclidean where++import Math.Metric.Metric (Metric(..), MetricCoord(..))+import Math.Coordinate.Cartesian (Cartesian(..), Point2(..))+++data Euclidean = Euclidean deriving Show+++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance MetricCoord Euclidean Cartesian where+ metricCoord _ = Cartesian++instance Floating a => Metric Euclidean (Point2 a) a where+ distanceBase _ (Point2 x1 y1) (Point2 x2 y2) = sqrt $ (x2-x1)**2 + (y2-y1)**2
+ src/Math/Metric/Metric.hs view
@@ -0,0 +1,33 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}++{-# LANGUAGE FlexibleInstances #-}++{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE OverlappingInstances #-}++module Math.Metric.Metric where++import Math.Coordinate.Coordinate --(SpaceOf, CoordConversion, AutoConversion, convertCoord)++class Metric metric el result | metric el -> result where+ distanceBase :: metric -> el -> el -> result++class MetricCoord metric coord | metric -> coord where+ metricCoord :: metric -> coord+++--distance :: (MetricCoord metric coord+-- , CoordConversion AutoConversion coord a t+-- , CoordConversion AutoConversion coord b t+-- , space ~ SpaceOf a+-- , space ~ SpaceOf b+-- , Metric metric t) =>+-- metric -> space -> a -> b -> Double++distance metric space a b = distanceBase metric (convertCoord coord space a) (convertCoord coord space b)+ where coord = metricCoord metric++
+ src/Math/Metric/Minkowski.hs view
@@ -0,0 +1,21 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}++module Math.Metric.Minkowski where++import Math.Metric.Metric (Metric(..), MetricCoord(..))+import Math.Coordinate.Cartesian (Cartesian(..), Point2(..))+++data Minkowski a = Minkowski a deriving Show+++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance MetricCoord (Minkowski a) Cartesian where+ metricCoord _ = Cartesian++instance Floating a => Metric (Minkowski a) (Point2 a) a where+ distanceBase (Minkowski p) (Point2 x1 y1) (Point2 x2 y2) = ((abs $ x1-x2)**p + (abs $ y1-y2)**p)**(1/p)
+ src/Math/Metric/Taxicab.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}++module Math.Metric.Taxicab where++import Math.Metric.Metric (Metric(..), MetricCoord(..))+import Math.Coordinate.Cartesian (Cartesian(..), Point2(..))+++data Taxicab = Taxicab deriving Show+++--------------------------------------------------------------------------------+-- Instances+--------------------------------------------------------------------------------++instance MetricCoord Taxicab Cartesian where+ metricCoord _ = Cartesian++instance Num a => Metric Taxicab (Point2 a) a where+ distanceBase _ (Point2 x1 y1) (Point2 x2 y2) = x2-x1 + y2-y1++
+ src/Math/Space/MetricSpace.hs view
@@ -0,0 +1,55 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}++{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE UndecidableInstances #-}++module Math.Space.MetricSpace where++import qualified Math.Metric.Metric as Metric+import Math.Metric.Metric (Metric, MetricCoord)+import Math.Coordinate.Coordinate --(SpaceOf, CoordConversion, AutoConversion, convertCoord)+++data MetricSpace metric space = MetricSpace { metric :: metric+ , space :: space + } deriving (Show)+++--distance :: (MetricCoord metric coord+-- , CoordConversion AutoConversion coord a t+-- , CoordConversion AutoConversion coord b t+-- , space ~ SpaceOf a+-- , space ~ SpaceOf b+-- , Metric metric t) =>+-- (MetricSpace metric space) -> a -> b -> Double+distance (MetricSpace metric space) = Metric.distance metric space++++--class Distance2 a b where+-- distance2 :: a -> b+++--data X a = X a++--instance (MetricCoord metric coord+-- , CoordConversion AutoConversion coord a t+-- , CoordConversion AutoConversion coord b t+-- , space ~ SpaceOf a+-- , space ~ SpaceOf b+-- , Metric metric t+-- , out ~ Double) =>+-- Distance2 (X metric) (space -> a -> b -> out) where+-- distance2 (X metric) = Metric.distance metric++--instance (MetricCoord metric coord+-- , CoordConversion AutoConversion coord a t+-- , CoordConversion AutoConversion coord b t+-- , space ~ SpaceOf a+-- , space ~ SpaceOf b+-- , Metric metric t+-- , out ~ Double) =>+-- Distance2 (MetricSpace metric space) (a -> b -> out) where+-- distance2 = distance
+ src/Math/Space/Space.hs view
@@ -0,0 +1,23 @@+---------------------------------------------------------------------------+-- Copyright (C) Flowbox, Inc - All Rights Reserved+-- Unauthorized copying of this file, via any medium is strictly prohibited+-- Proprietary and confidential+-- Flowbox Team <contact@flowbox.io>, 2014+---------------------------------------------------------------------------++module Math.Space.Space where++--data Space2 = Space2 !Double !Double deriving (Show)++class Space2 space where+ width :: space a -> a+ height :: space a -> a++class Space2 space => Space3 space where+ depth :: space a -> a++data Grid a = Grid !a !a deriving (Show)++instance Space2 Grid where+ width (Grid x _) = x+ height (Grid _ x) = x