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


```d
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:

```d
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

Reply via email to