ms 0.2 → 0.2.1
raw patch · 4 files changed
+38/−5 lines, 4 filesdep +semigroupoids
Dependencies added: semigroupoids
Files
- CHANGELOG.md +16/−0
- ms.cabal +3/−1
- src/Math/MetricSpace.hs +18/−4
- tests/test.hs +1/−0
+ CHANGELOG.md view
@@ -0,0 +1,16 @@+0.2.1+-----+* Added a changelog.+* Added `hamming` distance metric.+* Added instance of `Semigroupoid`. (@tonymorris)+* Fixed hlint warnings.++0.2+---+* Fixed types of `discrete` and `levenshtein` to use `Integral` instead of+ `Floating`.+* Slight docs formatting fixes++0.1+---+Initial release.
ms.cabal view
@@ -1,5 +1,5 @@ name: ms-version: 0.2+version: 0.2.1 synopsis: metric spaces description: A 'MetricSpace' is a set together with a notion of distance between@@ -26,6 +26,7 @@ category: Math build-type: Simple cabal-version: >= 1.10+extra-source-files: CHANGELOG.md source-repository head type: git@@ -39,6 +40,7 @@ , edit-distance >= 0.2 && < 0.3 , lens >= 4 && < 5 , profunctors >= 5 && < 6+ , semigroupoids >= 3 && < 6 , semigroups >= 0.12 && < 0.17 , vector >= 0.10 && < 0.12 hs-source-dirs: src
src/Math/MetricSpace.hs view
@@ -37,6 +37,7 @@ import Data.Functor.Contravariant.Divisible import Data.Profunctor import Data.Semigroup+import Data.Semigroupoid import qualified Data.Vector as V import Text.EditDistance @@ -91,6 +92,10 @@ rmap f (MetricSpace b) = MetricSpace (\x y -> f (b x y)) {-# INLINE rmap #-} +instance Semigroupoid MetricSpace where+ MetricSpace m1 `o` MetricSpace m2 =+ MetricSpace (\a1 a2 -> let b = m2 a1 a2 in m1 b b)+ _FlippedMetricSpace :: Iso (MetricSpace a b)@@ -123,17 +128,17 @@ instance SwappedMetricSpace MetricSpace where _SwappedMetricSpace = iso- (\(MetricSpace m) -> MetricSpace (\a1 a2 -> m a2 a1))- (\(MetricSpace m) -> MetricSpace (\a2 a1 -> m a1 a2))+ (\(MetricSpace m) -> MetricSpace (flip m))+ (\(MetricSpace m) -> MetricSpace (flip m)) {-# INLINE _SwappedMetricSpace #-} instance SwappedMetricSpace FlippedMetricSpace where _SwappedMetricSpace = iso (\(FlippedMetricSpace (MetricSpace m)) ->- FlippedMetricSpace (MetricSpace (\a1 a2 -> m a2 a1)))+ FlippedMetricSpace (MetricSpace (flip m))) (\(FlippedMetricSpace (MetricSpace m)) ->- FlippedMetricSpace (MetricSpace (\a1 a2 -> m a2 a1)))+ FlippedMetricSpace (MetricSpace (flip m))) {-# INLINE _SwappedMetricSpace #-} -- | Levenshtein distance between 'String's.@@ -187,3 +192,12 @@ where f a b = V.sum (V.zipWith (\x y -> abs (x-y)) a b) {-# INLINE taxicab #-}++-- | Hamming distance over n-dimensional 'Vector's.+hamming :: (Eq a, Integral b) => MetricSpace (V.Vector a) b+hamming =+ MetricSpace (\x y ->+ fromIntegral .+ V.length .+ V.filter (uncurry (/=)) $ V.zip x y)+{-# INLINE hamming #-}
tests/test.hs view
@@ -72,6 +72,7 @@ -- Integer , testGroup "Integer" [ genTestGroupV "discrete" (discrete :: MetricSpace (V.Vector Integer) Integer)+ , genTestGroupV "hamming" (hamming :: MetricSpace (V.Vector Char) Integer) ] -- Double