lc0815

lc0815

How to extract info from an Enum.reduce function other than a single item

I have a need to extract the individual items from an Enum.reduce function but I get is the single value from the acc.

Here is the sample code:

defmodule Demo do
  def add_sequence_number(business_card) do

    business_card
        |> String.split("\n")
        |> Enum.reduce(1, fn (x, acc) -> IO.inspect "#{acc}$#$#{x}"; acc + 1 end)

  end
end

business_card = """
Bruce Waine,Batman
Bat cave
Gotham City, NY 12345
987.123.5984

Gotham Security Services Co
Crime fighter
Wonder Woman
"""

new_card = Demo.add_sequence_number(business_card)

IO. puts "\nthis is the result:  #{new_card}\n"

here is a screen shot of the result:

what I need is the array from the inner reduce function but I am getting is the result of 10 and I need to access the list as in the image.

any tips, thank you

Most Liked

al2o3cr

al2o3cr

A helpful way to think about these situations is to think about the types.

Enum.reduce expects a function of type (element, accumulator) -> accumulator and returns a result of type accumulator.

Enum.scan expects a function of type (element, accumulator) -> accumulator and returns a result of type [accumulator], so it’s worth considering if you’re expecting a list of results.

A good example for comparing the two is with lists of integers:

numbers = [1, 2, 3, 4]

Enum.reduce(numbers, 0, fn n, acc ->
  n + acc
end)
# returns the TOTAL: 10

Enum.scan(numbers, 0, fn n, acc ->
  n + acc
end)
# returns the list of SUBTOTALS: [1, 3, 6, 10]

In your example, using binaries (like "1$#$Bruce Waine, Batman") as an accumulator type is less than ideal. A better intermediate format would be a tuple like {1, "Bruce Waine, Batman"}, resulting in code like:

business_card
|> String.split("\n")
|> Enum.scan({0, ""}, fn line, {acc_number, _} ->
  {acc_number+1, line}
end)
|> Enum.map(fn {n, line} ->
  "#{n}$#$#{line}
end)
dimitarvp

dimitarvp

You don’t exactly need Enum.reduce then, you likely need Enum.with_index plus Enum.map, but it can be done with Enum.reduce by using a tuple accumulator as @kip showed you.

kip

kip

ex_cldr Core Team

Whatever the function returns become acc on the next iteration. And whatever acc is at the end is returned by Enum.reduce/3. Therefore you will be accumulating a list of results in many common cases, including this one.

Think more along the lines of:

{count, results} =
  Enum.reduce(cards, {0, []}, fn (x, {seq, acc) ->
    seq = seq + 1
    {seq, "#{seq}$#$#{x}"}
  end)

Last Post!

dimitarvp

dimitarvp

btw you can also go and do Exercism.IO’s Elixir track. There is also a chapter where you have to reinvent part of the Enum module yourself – that was a huge eye-opener for me.

Where Next?

Popular in Questions Top

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
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New

Other popular topics Top

Qqwy
Update: How to use the Blogs & Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 130286 1222
New
nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

We're in Beta

About us Mission Statement