[Haskell-cafe] Client-extensible heterogeneous types (Duck-typed variadic functions?)

Ketil Malde ketil at malde.org
Thu Oct 14 09:24:34 EDT 2010


Jacek Generowicz <jacek.generowicz at cern.ch> writes:

> def memoize(fn):
>    cache = {}
>    def memoized_fn(*args):
>        if args not in cache:
>            cache[args] = fn(*args)
>        return cache[args]
>    return memoized_fn

Here's a simplified memoizer for Haskell:

  memoize :: (Integral t) => (t -> a) -> t -> a
  memoize f = ([f i | i <- [0..]]!!) . fromIntegral

> But what should the type of fn be? What should the type of args be? 

The args to fn must be of a type that is indexable by the memoizing
structure.  My example is simplistic, and will only memoize functions
where the first argument is a integral, non-negative number, and it uses
a list (with O(n) access), but you can probably improve it as you see
fit.

I think this will work for multi-parameter functions too, because of
currying.

> In Python, I don't care, as long no type error occurs when they are
> combined thus:

>    fn(*args)

In Haskell, the type of 'memoize g' is the same as 'g', so you don't
have to care - the compiler cares for you. :-)

Perhaps I'm missing something obvious?

-k
-- 
If I haven't seen further, it is by standing in the footprints of giants


More information about the Haskell-Cafe mailing list