owaisqayum

owaisqayum

Understanding Enum.scan

Hi,

I am having a list of tuples

list = [{-1, 3}, {1, 5}, {10, 15}]

When i pass it through Enum.scan, it gives me the following result. Its a program i saw on codewars but i really dont understand how the Enum.scan is working over here.

Enum.scan(list, fn {b, e}, {_, x} -> {max(b, x), max(e, x)} end)

output: [{-1, 3}, {3, 5}, {10, 15}]

I tried IO.inspect to look at the results but still, it doesn’t make any sense. Here is the result of IO.inspect

b: 1
x1: 3
max(b, x): 3
e: 5
x2: 3
max(e, x): 5
b: 10
x1: 5
max(b, x): 10
e: 15
x2: 5
max(e, x): 15
[{-1, 3}, {3, 5}, {10, 15}]

First Post!

fuelen

fuelen

Hi,
It makes sense :slight_smile: As you don’t pass initial accumulator, then the first element of the list was taken and the first element on output will be the same as on input - {-1, 3}.
Then, on first iteration

[b: 1, e: 5, x: 3]

b and e are from the second element of the list and x is from accumulator which is the first element of the list.
Then you build new two-element tuple which is {3, 5}, it is used as second value in output list and as accumulator for the next element.
Then on the next iteration

[b: 10, e: 15, x: 5]

b and e are from the last element and x is from accumulator. Newly built tuple is {10, 15}, it is used as third element.
So, we have

[{-1, 3}, {3, 5}, {10, 15}]

Maybe, it would be easier for you if we reimplement Enum.scan using Enum.map_reduce:

def my_scan([], _callback), do: []
def my_scan([head | tail], callback) do
  {map_result, _reduce_result} = Enum.map_reduce(tail, head,  fn x, acc ->
    result = callback.(x, acc)
    {result, result}
  end)
  [head | map_result]
end

Where Next?

Popular in Discussions Top

AlexMcConnell
The reason that Rails is as popular as it is is because it’s very easy for relatively inexperienced developers to get a lot of work done....
588 20142 166
New
restack_oslo
Hello, Please pardon me for any faux paux. I am 46 and this is my first time on a forum of any kind. I wanted to to get answers from tho...
New
MarioFlach
Hello, I want to share a project I’ve been working on for a while: https://github.com/almightycouch/gitgud Background Some time ago I ...
New
boundedvariable
I am going through the kafka architecture. All the features what the kafka is providing are already in Erlang. I would like hear your opi...
New
wmnnd
The Go vs Elixir thread got me thinking: Would it be too hard to implement a simple mechanism for creating Go-style static app binaries f...
New
opsb
We’re considering our architecture from a viewpoint of scaling our traffic heavily over the next 6 months. Our current deployment is runn...
New
pillaiindu
I want to convert a Phoenix LiveView CRUD website to a CRUD mobile app. What do you think is the easiest way to do so?
New

Other popular topics Top

JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
274 42716 114
New

We're in Beta

About us Mission Statement