On Mon, Aug 1, 2016 at 4:15 PM, Kristoffer Carlsson <[email protected]> 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) >> >> >> >
