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
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
kip
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
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.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security










