ghc-typelits-extra 0.1.2 → 0.1.3
raw patch · 6 files changed
+28/−35 lines, 6 filesdep +integer-gmp
Dependencies added: integer-gmp
Files
- CHANGELOG.md +4/−0
- README.md +1/−1
- ghc-typelits-extra.cabal +3/−3
- src/GHC/TypeLits/Extra.hs +2/−7
- src/GHC/TypeLits/Extra/Solver.hs +1/−2
- src/GHC/TypeLits/Extra/Solver/Operations.hs +17/−22
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Changelog for the [`ghc-typelits-extra`](http://hackage.haskell.org/package/ghc-typelits-extra) package +## 0.1.3 *July 19th 2016*+* Fixes bugs:+ * Rounding error in `CLog` calculation+ ## 0.1.2 *July 8th 2016* * Solve KnownNat constraints over CLog and GCD, i.e., KnownNat (CLog 2 4)
README.md view
@@ -8,4 +8,4 @@ as a GHC type-checker plugin: * `GHC.TypeLits.Extra.GCD`: a type-level `gcd`-* `GHC.TypeLits.Extra.CLog`: type-level equivalent of `clog x y = ceiling (logBase x y)`+* `GHC.TypeLits.Extra.CLog`: type-level equivalent of _the ceiling of_ [integerLogBase#](https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35-)
ghc-typelits-extra.cabal view
@@ -1,13 +1,12 @@ name: ghc-typelits-extra-version: 0.1.2+version: 0.1.3 synopsis: Additional type-level operations on GHC.TypeLits.Nat description: Additional type-level operations on @GHC.TypeLits.Nat@: . * @GHC.TypeLits.Extra.GCD@: a type-level @gcd@ .- * @GHC.TypeLits.Extra.CLog@: type-level equivalent of- \"@clog x y = ceiling (logBase x y)@\"+ * @GHC.TypeLits.Extra.CLog@: type-level equivalent /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#> . And a custom solver for the above operations defined in @GHC.TypeLits.Extra.Solver@ as a GHC type-checker plugin. To use the plugin,@@ -49,6 +48,7 @@ build-depends: base >= 4.8 && <5, ghc >= 7.10 && <8.2, ghc-tcplugins-extra >= 0.2,+ integer-gmp >= 1.0 && <1.1, transformers >= 0.4.2.0 && < 0.6 hs-source-dirs: src default-language: Haskell2010
src/GHC/TypeLits/Extra.hs view
@@ -7,8 +7,7 @@ * 'GCD': a type-level 'gcd' - * 'CLog': type-level equivalent of- \"@clog x y = 'ceiling' ('logBase' x y)@\"+ * 'CLog': type-level equivalent of /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#> A custom solver for the above operations defined is defined in "GHC.TypeLits.Extra.Solver" as a GHC type-checker plugin. To use the plugin,@@ -39,11 +38,7 @@ type family GCD (x :: Nat) (y :: Nat) :: Nat where GCD 0 x = x -- Additional equations are provided by the custom solver --- | Type-level equivalent of:------ @--- clog x y = 'ceiling' ('logBase' x y)--- @+-- | Type-level equivalent of /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#> -- -- Note that additional equations are provided by the type-checker plugin solver -- "GHC.TypeLits.Extra.Solver".
src/GHC/TypeLits/Extra/Solver.hs view
@@ -63,8 +63,7 @@ -- -- * @GHC.TypeLits.Extra.GCD@: a type-level 'gcd' ----- * @GHC.TypeLits.Extra.CLog@: type-level equivalent of--- \"@clog x y = 'ceiling' ('logBase' x y)@\"+-- * @GHC.TypeLits.Extra.CLog@: type-level equivalent of /the ceiling of/ <https://hackage.haskell.org/package/integer-gmp/docs/GHC-Integer-Logarithms.html#v:integerLogBase-35- integerLogBase#> -- -- To use the plugin, add --
src/GHC/TypeLits/Extra/Solver/Operations.hs view
@@ -4,7 +4,7 @@ Maintainer : Christiaan Baaij <christiaan.baaij@gmail.com> -} -{-# LANGUAGE CPP, GeneralizedNewtypeDeriving #-}+{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, MagicHash #-} #if __GLASGOW_HASKELL__ < 711 {-# LANGUAGE StandaloneDeriving #-} #endif@@ -15,12 +15,14 @@ , mergeGCD , mergeCLog , mergeExp- , mergeAdd- , mergeSub- , mergeMul ) where +-- external+import GHC.Base (isTrue#,(==#),(+#))+import GHC.Integer (smallInteger)+import GHC.Integer.Logarithms (integerLogBase#)+ -- GHC API import Outputable (Outputable (..), (<+>), integer, text) import Type (Type, TyVar)@@ -61,26 +63,19 @@ mergeCLog :: ExtraOp -> ExtraOp -> Maybe ExtraOp mergeCLog i (Exp j k) | i == j && (i /= (I 0)) = Just k-mergeCLog (I i) (I j)- | i > 1 && j > 0 = Just (I (ceiling (logBase (fromInteger i :: Double)- (fromInteger j))))- | otherwise = Nothing-mergeCLog x y = Just (CLog x y)+mergeCLog (I i) (I j) = I <$> clogBase i j+mergeCLog x y = Just (CLog x y) mergeExp :: ExtraOp -> ExtraOp -> ExtraOp mergeExp (I i) (I j) = I (i^j) mergeExp x y = Exp x y -mergeAdd :: ExtraOp -> ExtraOp -> Maybe ExtraOp-mergeAdd (I i) (I j) = Just (I (i + j))-mergeAdd _ _ = Nothing--mergeSub :: ExtraOp -> ExtraOp -> Maybe ExtraOp-mergeSub (I i) (I j)- | let s = i - j- , s >= 0 = Just (I s)-mergeSub _ _ = Nothing--mergeMul :: ExtraOp -> ExtraOp -> Maybe ExtraOp-mergeMul (I i) (I j) = Just (I (i * j))-mergeMul _ _ = Nothing+-- | \x y -> ceiling (logBase x y), x > 1 && y > 0+clogBase :: Integer -> Integer -> Maybe Integer+clogBase x y | x > 1 && y > 0 =+ let z1 = integerLogBase# x y+ z2 = integerLogBase# x (y-1)+ in if (isTrue# (z1 ==# z2))+ then Just (smallInteger (z1 +# 1#))+ else Just (smallInteger z1)+clogBase _ _ = Nothing