This is a really cool family of tricks. Time for me to start replacing some 
::Function specifiers in my argument lists...

--Tim

On Monday, August 18, 2014 09:00:22 PM Rafael Fourquet wrote:
> I'm glad to report that the general and beautifully functional solution sum(
> imap(sinc_plus_x, x)) is in fact as efficient as the "devectorized"
> hand-written one!
> 
> It turns out I made the mistake to forget to forward an expression like
> "{Type{F}}" to the imap iterator constructor (cf. code below), making it
> specialized on DataType instead of sinc_plus_x. (While I can see why this
> prevented inlining, I still don't understand this caused allocations).
> 
> For the record, here is a possible implementation of imap for "functors"
> with 1 argument:
> 
> immutable imap{TF, X}
>     F::TF
>     x::X
> end
> imap{F, X}(::Type{F}, x::X) = imap{Type{F}, X}(F, x)
> 
> Base.start(i::imap) = start(i.x)
> Base.next(i::imap, s) = ((v, s) = next(i.x, s); (i.F(v), s))
> Base.done(i::imap, s) = done(i.x, s)

Reply via email to