FunctionWrappers.jl is great, it just saved me! Any chance you might actually 
register it? It is super useful... And at least until something like that 
exists in Base, it would be great to be able to add it as a dependency.

> -----Original Message-----
> From: julia-users@googlegroups.com [mailto:julia-
> us...@googlegroups.com] On Behalf Of Yichao Yu
> Sent: Monday, August 1, 2016 1:30 AM
> To: Julia Users <julia-users@googlegroups.com>
> Subject: Re: [julia-users] Re: Tuples of Functions
> 
> On Mon, Aug 1, 2016 at 4:15 PM, Kristoffer Carlsson
> <kcarlsso...@gmail.com> wrote:
> > The problem is not with the return value of the passed functions, it
> > is with inferring the type of `f`. Each function has it's own type and
> > that in turn makes `f` bind to different types (first f1 then f2) in
> > the loop i.e a type instability.
> 
> Ref https://github.com/JuliaLang/julia/issues/13984 and a proof of principle
> implementation at https://github.com/yuyichao/FunctionWrappers.jl that I
> wrote a few days ago. Note that the package is mainly an experiment to
> check what features are needed and I'm not planing to register it.
> 
> >
> >
> > On Monday, August 1, 2016 at 5:53:23 AM UTC+2, Christoph Ortner wrote:
> >>
> >> Consider the following code snippet which shows the following expect
> >> problem (on v0.5): if I form a tuple of functions, pass this tuple to
> >> another function, then julia cannot infer enough information about
> >> them and runs into a type instability.
> >>
> >> MY QUESTION is: is there a work-around?  I.e., can I form an array,
> >> tuple, etc of functions and call them without losing type stability?
> >>
> >> (declaring return-type did not help, which surprised me since I
> >> thought that would give the additional information about what the two
> >> functions f1,
> >> f2 in the tuple do)
> >>
> >>
> >> function test(N, ff)
> >>     r = 0.234; s = 0.0
> >>     for n = 1:N, f in ff
> >>         s = s + f(r)::Float64
> >>     end
> >>     return s
> >> end
> >>
> >>
> >> function test2(N, f1, f2)
> >>     r = 0.234; s = 0.0
> >>     for n = 1:N
> >>         s = s + f1(r) + f2(r)
> >>     end
> >>     return s
> >> end
> >>
> >>
> >> f1(r::Float64)::Float64 = r^3
> >> f2(r::Float64)::Float64 = r^5
> >>
> >>
> >> test(10, (f1,f2))
> >> test(10, (f1,f1))
> >> test2(10, f1,f2)
> >>
> >>
> >> @time test(1_000_000, (f1,f2))    # 0.079190 seconds (4.00 M
> >> allocations...
> >> @time test2(1_000_000, f1, f2)    # 0.002279 seconds (5 allocations: 176
> >> bytes)
> >> @time test(1_000_000, (f1,f1))    # 0.002664 seconds (5 allocations: 176
> >> bytes)
> >>
> >>
> >>
> >

Reply via email to