ah, ok, thanks. andrew
On Wednesday, 5 March 2014 19:03:49 UTC-3, Simon Kornblith wrote: > > If you have e.g. a function that always returns Int, then you can specify > the associative type as Dict{Any,Int}, which allows type inference to > determine that anything pulled out of it is an Int, so the return type of > the memoized function can be inferred: > > julia> using Memoize > > julia> @memoize Dict{Any,Int} f(y) = y + 1 > > julia> Base.return_types(f, (Int,)) > 1-element Array{Any,1}: > Int64 > > Of course this doesn't work if you don't specify the Dict type: > > julia> @memoize f(y) = y + 1 > > julia> Base.return_types(f, (Int,)) > 1-element Array{Any,1}: > Any > > Simon > > On Wednesday, March 5, 2014 2:53:09 PM UTC-5, andrew cooke wrote: >> >> we're talking about >> https://github.com/simonster/Memoize.jl/blob/master/src/Memoize.jl ? >> >> i must be missing something. where is the type? >> >> thanks, >> andrew >> >> On Wednesday, 5 March 2014 16:24:34 UTC-3, Pierre-Yves Gérardy wrote: >>> >>> It already accepts a type as an optional parameter. >>> >>> On Wednesday, March 5, 2014 7:41:42 PM UTC+1, andrew cooke wrote: >>>> >>>> >>>> it seemed to me (when i looked at the code) that would be trivial to >>>> add to Memoize.jl by adding a type parameter to the macro and reading from >>>> the cache into a typed variable. >>>> >>>> but since i spilt coke all over my netbook yesterday my julia >>>> programming is on hiatus :o( >>>> >>>> andrew >>>> >>>> >>>> On Wednesday, 5 March 2014 10:26:37 UTC-3, Toivo Henningsson wrote: >>>>> >>>>> The trouble with memoization and type inference is that when type >>>>> inference sees a memoized function, it will see that the return value is >>>>> either computed, or looked up in the cache. The type of the cached value >>>>> might be anything, unless the user supplies an explicit type restriction. >>>>> There's no way to tell type inference that the cached must have been >>>>> computed by the function previously, so that it can be disregarded when >>>>> it >>>>> comes to inferring the return type. >>>>> >>>>> On Wednesday, 5 March 2014 01:34:10 UTC+1, Pierre-Yves Gérardy wrote: >>>>>> >>>>>> >>>>>> >>>>>> On Tuesday, March 4, 2014 3:01:13 AM UTC+1, andrew cooke wrote: >>>>>>> >>>>>>> >>>>>>> i assumed that passing by value was an optimization, but i don't >>>>>>> know what triggers it. it may be that it's only for immutable types >>>>>>> without pointers to mutable types. or it may be based on size. it >>>>>>> might >>>>>>> be something to worry about if your instances are large. >>>>>>> >>>>>>> there's a memoize.jl module somewhere that defines a macro that >>>>>>> automatically memoizes the function it's applied to. so you could use >>>>>>> that >>>>>>> on your constructor function, but: >>>>>>> >>>>>>> 1 - i'm not sure how nesting affects things >>>>>>> >>>>>> 2 - when i looked at memoize.jl, by default it used a simple map (no >>>>>>> weak keys or lru eviction) >>>>>>> >>>>>> >>>>>> Yes, but you can pass a collection of your choice as a cache. Julia >>>>>> provides a WeakKeyDict, but if your function depends on multiple inputs, >>>>>> using tuples as keys makes it moot. >>>>>> >>>>>> I'll go ahead and skip this whole identity thing for now :-) >>>>>> >>>>>> 3 - someone said that using memoize.jl broke type inference of >>>>>>> return arguments (i don't understand why) which had a performance >>>>>>> impact. >>>>>>> >>>>>> >>>>>> That was Stephan Karpinski. I wonder if it holds when using a >>>>>> `memoize` macro that creates a named function and a typed cache. >>>>>> >>>>>> —Pierre-Yves >>>>>> >>>>>