MemoTrie 0.6.6 → 0.6.7
raw patch · 2 files changed
+41/−4 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.MemoTrie: memoFix :: HasTrie a => ((a -> b) -> (a -> b)) -> (a -> b)
Files
- MemoTrie.cabal +2/−2
- src/Data/MemoTrie.hs +39/−2
MemoTrie.cabal view
@@ -1,5 +1,5 @@ Name: MemoTrie-Version: 0.6.6+Version: 0.6.7 Cabal-Version: >= 1.10 Synopsis: Trie-based memo functions Category: Data@@ -10,7 +10,7 @@ . Project wiki page: <http://haskell.org/haskellwiki/MemoTrie> .- © 2008-2015 by Conal Elliott; BSD3 license.+ © 2008-2016 by Conal Elliott; BSD3 license. Homepage: https://github.com/conal/MemoTrie Author: Conal Elliott Maintainer: conal@conal.net
src/Data/MemoTrie.hs view
@@ -55,12 +55,14 @@ , memo, memo2, memo3, mup , inTrie, inTrie2, inTrie3 -- , untrieBits- , trieGeneric, untrieGeneric, enumerateGeneric, Reg + , trieGeneric, untrieGeneric, enumerateGeneric, Reg+ , memoFix ) where -- Export the parts of HasTrie separately in order to get the associated data -- type constructors, so I can define instances of other classes on them. +import Data.Function (fix) import Data.Bits import Data.Word import Data.Int@@ -168,6 +170,42 @@ memo2 = mup memo memo3 = mup memo2 +-- | Memoizing recursion. Use like `fix`.+memoFix :: HasTrie a => ((a -> b) -> (a -> b)) -> (a -> b)+memoFix h = fix (memo . h)++#if 0+-- Equivalently,++memoFix h = fix (\ f' -> memo (h f'))++memoFix h = f'+ where f' = memo (h f')++memoFix h = f'+ where+ f' = memo f+ f = h f'+#endif++#if 0+-- Example++fibF :: (Integer -> Integer) -> (Integer -> Integer)+fibF _ 0 = 1+fibF _ 1 = 1+fibF f n = f (n-1) + f (n-2)++fib :: Integer -> Integer+fib = fix fibF++fib' :: Integer -> Integer+fib' = memoFix fibF++-- Try fib 30 vs fib' 30+#endif++ -- | Apply a unary function inside of a trie inTrie :: (HasTrie a, HasTrie c) => ((a -> b) -> (c -> d))@@ -685,4 +723,3 @@ liftSum :: Either (f a) (g a) -> (f :+: g) a liftSum = either L1 R1 {-# INLINEABLE liftSum #-}-