Copyright | (c) Conal Elliott 2008-2016 |
---|---|
License | BSD3 |
Maintainer | conal@conal.net |
Stability | experimental |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Trie-based memoizer
Adapted from sjanssen's paste: "a lazy trie" , which I think is based on Ralf Hinze's paper "Memo Functions, Polytypically!".
You can automatically derive generic instances. for example:
{-# LANGUAGE DeriveGeneric, TypeOperators, TypeFamilies #-} import Data.MemoTrie import GHC.Generics (Generic) data Color = RGB Int Int Int | NamedColor String deriving (Generic
) instance HasTrie Color where newtype (Color :->: b) = ColorTrie { unColorTrie ::Reg
Color :->: b } trie =trieGeneric
ColorTrie untrie =untrieGeneric
unColorTrie enumerate =enumerateGeneric
unColorTrie
see
examples/Generic.hs
, which can be run with:
cabal configure -fexamples && cabal run generic
Synopsis
- class HasTrie a where
- domain :: HasTrie a => [a]
- idTrie :: HasTrie a => a :->: a
- (@.@) :: ( HasTrie a, HasTrie b) => (b :->: c) -> (a :->: b) -> a :->: c
- memo :: HasTrie t => (t -> a) -> t -> a
- memo2 :: ( HasTrie s, HasTrie t) => (s -> t -> a) -> s -> t -> a
- memo3 :: ( HasTrie r, HasTrie s, HasTrie t) => (r -> s -> t -> a) -> r -> s -> t -> a
- mup :: HasTrie t => (b -> c) -> (t -> b) -> t -> c
- inTrie :: ( HasTrie a, HasTrie c) => ((a -> b) -> c -> d) -> (a :->: b) -> c :->: d
- inTrie2 :: ( HasTrie a, HasTrie c, HasTrie e) => ((a -> b) -> (c -> d) -> e -> f) -> (a :->: b) -> (c :->: d) -> e :->: f
- inTrie3 :: ( HasTrie a, HasTrie c, HasTrie e, HasTrie g) => ((a -> b) -> (c -> d) -> (e -> f) -> g -> h) -> (a :->: b) -> (c :->: d) -> (e :->: f) -> g :->: h
- trieGeneric :: ( Generic a, HasTrie ( Reg a)) => (( Reg a :->: b) -> a :->: b) -> (a -> b) -> a :->: b
- untrieGeneric :: ( Generic a, HasTrie ( Reg a)) => ((a :->: b) -> Reg a :->: b) -> (a :->: b) -> a -> b
- enumerateGeneric :: ( Generic a, HasTrie ( Reg a)) => ((a :->: b) -> Reg a :->: b) -> (a :->: b) -> [(a, b)]
- type Reg a = Rep a ()
- memoFix :: HasTrie a => ((a -> b) -> a -> b) -> a -> b
Documentation
class HasTrie a where Source #
Mapping from all elements of
a
to the results of some function
trie :: (a -> b) -> a :->: b Source #
Create the trie for the entire domain of a function
untrie :: (a :->: b) -> a -> b Source #
Convert a trie to a function, i.e., access a field of the trie
enumerate :: (a :->: b) -> [(a, b)] Source #
List the trie elements. Order of keys (
:: a
) is always the same.
Instances
HasTrie Bool Source # | |
HasTrie Char Source # | |
HasTrie Int Source # | |
HasTrie Int8 Source # | |
HasTrie Int16 Source # | |
HasTrie Int32 Source # | |
HasTrie Int64 Source # | |
HasTrie Integer Source # | |
HasTrie Word Source # | |
HasTrie Word8 Source # | |
HasTrie Word16 Source # | |
HasTrie Word32 Source # | |
HasTrie Word64 Source # | |
HasTrie () Source # | |
HasTrie Void Source # | |
HasTrie x => HasTrie [x] Source # | |
HasTrie a => HasTrie ( Maybe a) Source # | |
( HasTrie a, HasTrie b) => HasTrie ( Either a b) Source # | |
HasTrie ( V1 x) Source # |
just like
|
HasTrie ( U1 x) Source # |
just like
|
( HasTrie a, HasTrie b) => HasTrie (a, b) Source # | |
( HasTrie a, HasTrie b, HasTrie c) => HasTrie (a, b, c) Source # | |
HasTrie a => HasTrie ( K1 i a x) Source # |
wraps
|
( HasTrie (f x), HasTrie (g x)) => HasTrie ((f :+: g) x) Source # |
wraps
|
( HasTrie (f x), HasTrie (g x)) => HasTrie ((f :*: g) x) Source # |
wraps
|
HasTrie (f x) => HasTrie ( M1 i t f x) Source # |
wraps
|
(@.@) :: ( HasTrie a, HasTrie b) => (b :->: c) -> (a :->: b) -> a :->: c infixr 9 Source #
Trie composition
memo2 :: ( HasTrie s, HasTrie t) => (s -> t -> a) -> s -> t -> a Source #
Memoize a binary function, on its first argument and then on its second. Take care to exploit any partial evaluation.
memo3 :: ( HasTrie r, HasTrie s, HasTrie t) => (r -> s -> t -> a) -> r -> s -> t -> a Source #
Memoize a ternary function on successive arguments. Take care to exploit any partial evaluation.
mup :: HasTrie t => (b -> c) -> (t -> b) -> t -> c Source #
Lift a memoizer to work with one more argument.
inTrie :: ( HasTrie a, HasTrie c) => ((a -> b) -> c -> d) -> (a :->: b) -> c :->: d Source #
Apply a unary function inside of a trie
inTrie2 :: ( HasTrie a, HasTrie c, HasTrie e) => ((a -> b) -> (c -> d) -> e -> f) -> (a :->: b) -> (c :->: d) -> e :->: f Source #
Apply a binary function inside of a trie
inTrie3 :: ( HasTrie a, HasTrie c, HasTrie e, HasTrie g) => ((a -> b) -> (c -> d) -> (e -> f) -> g -> h) -> (a :->: b) -> (c :->: d) -> (e :->: f) -> g :->: h Source #
Apply a ternary function inside of a trie
trieGeneric :: ( Generic a, HasTrie ( Reg a)) => (( Reg a :->: b) -> a :->: b) -> (a -> b) -> a :->: b Source #
untrieGeneric :: ( Generic a, HasTrie ( Reg a)) => ((a :->: b) -> Reg a :->: b) -> (a :->: b) -> a -> b Source #
enumerateGeneric :: ( Generic a, HasTrie ( Reg a)) => ((a :->: b) -> Reg a :->: b) -> (a :->: b) -> [(a, b)] Source #