On Tuesday, 22 February 2022 at 13:53:34 UTC, steve wrote:
> On Monday, 21 February 2022 at 23:07:44 UTC, Ali Çehreli wrote:
> On 2/21/22 12:44, steve wrote:
...
thanks for your help. I'm unfortunately still a bit confused. Maybe I wasn't clear or maybe I'm just missing something here. What I was trying to return is function that can then be applied to e.g. an array. As I understand the mapped function you wrote expects a range and a function argument something that would let me do
float my_function(float x){ return 2*x;}
auto my_function_mapped = mapped(my_function);
assert(my_function_mapped([1.,2.,3.]) == [2.,4.,6.]);
map
does not eagerly allocate or process data. map
is actually a lazy function, meaning it doesn't actually run until you look at the elements.
If you want a concrete range, you can use array
from std.array
as follows:
float[] get_map(alias f)(float[] input){
import std.algorithm : map;
import std.array : array;
return input.map!(f).array;
}
array
iterates all elements in the range and allocates a new array to hold the data.
I know in other languages, people are used to just using arrays for all high-level composition, but D tries not to incur the allocation/copy penalty if it can help it. So it's worth questioning if you actually need an array, or if you can just use the map result directly.
-Steve