Awesome, yea exactly.

Ah, i wondered if you would come up with a use case in Nx.

I’d love to give this a stab if that’s okay so I’ll get a pr together.

Adz

On Sat, 20 Mar 2021 at 15:15, José Valim <[email protected]> wrote:

> Thanks, I also needed zip_reduce a couple days ago while working on Nx, so
> zip_reduce is appreciated. The cool thing is that we can also implement
> both zip_with and zip on top of zip_reduce, so it shouldn’t make the code
> more complex either.
>
> A PR is welcome!
>
>
>
> On Sat, Mar 20, 2021 at 15:10 [email protected] <[email protected]>
> wrote:
>
>> Here are some use cases that having a reducer would help with:
>>
>> ```elixir
>> Enum.zip([:a, :b, :c], [1, 2, 3], %{}, fn k, val, acc -> Map.put(acc, k,
>> val)  end)
>> # %{a: 1, b: 2, c: 3}
>>
>> def zip_into_map(left, right) do
>>   Enum.zip(left, right, %{}, fn k, val, acc -> Map.put(acc, k, val)  end)
>> end
>>
>> csv_headers = ["id", "date", "whatever"]
>>
>> Enum.map(csv_rows, fn row ->
>>   zip_into_map(csv_headers, row)
>> end)
>>
>> dot_product =
>>   Enum.zip([1, 2], [3, 4], [], fn l, r, acc -> [ l * r | acc] end)
>>   |> Enum.reverse
>>
>> def zip_merge_values(left, right) do
>>   Enum.zip(left, right, %{}, fn
>>     {key, left_val}, {key, right_val}, acc ->
>>       Map.put(acc, key, left_val ++ right_val)
>>
>>     {left_key, left_val}, {right_key, right_val}, acc ->
>>       Map.merge(acc, %{left_key => left_val, right_key => right_val})
>>   end)
>> end
>>
>> zip_merge_values(%{a: [1], c: [5]}, %{a: [2], b: [7])
>> # %{a: [1, 2], b: [7] c: [5]}
>>
>> Enum.zip_with(["a", "key", "list"], Stream.repeatedly(fn -> 10 end), %{},
>> fn k, v, acc ->
>>   Map.merge(acc, {k, v})
>> end)
>>
>> # => %{"a" => 10, "key" => 10, "list" => 10}
>> ```
>>
>> Though I think if we are really going for it if you had a Zippable
>> protocol a la Eumerable and defined Zippable.reduce_while you'd get a lot
>> of functions for free I suspect.
>>
>> Best
>>
>> Adam
>>
>>
>> On Wednesday, February 3, 2021 at 5:59:34 AM UTC José Valim wrote:
>>
>>> I think zip_with is still valuable as is because a zip_with without an
>>> accumulator can be streamable (i.e. in the Stream module) but a zip_with
>>> with an accumulator cannot. We may be looking at a zip_reduce in the future
>>> though, given use cases are provided. :)
>>>
>>> On Tue, Feb 2, 2021 at 11:29 PM [email protected] <[email protected]>
>>> wrote:
>>>
>>>> How embarrasing I typo'd the subject. It should read Should zip /
>>>> zip_with have a reducer?
>>>>
>>>> Best
>>>>
>>>> Adam
>>>>
>>>> On Tuesday, February 2, 2021 at 10:27:49 PM UTC [email protected]
>>>> wrote:
>>>>
>>>>> Hello!
>>>>>
>>>>> I was thinking about zip_with/3 et al. (don't judge me I'm in a
>>>>> lockdown).
>>>>>
>>>>> Currently they work by returning a list, but would it not make more
>>>>> sense for it to take an accumulator?
>>>>>
>>>>> ```elixir
>>>>> Enum.zip_with([1, 2], [3, 4], %{}, fn left, right, acc -> Map.put(acc,
>>>>> left, right) end)
>>>>> %{ 1 => 3, 2 => 4 }
>>>>>
>>>>> Enum.zip_with([1, 2], [3, 4], [], fn left, right, acc -> [{left,
>>>>> right} | acc] end)
>>>>> [{1, 3}, {2, 4}]
>>>>> ```
>>>>> If so... I guess it also opens to door for a zip_while.
>>>>>
>>>>> Am I mad? Has science gone too far?
>>>>>
>>>>> Best
>>>>>
>>>>> Adz
>>>>>
>>>>>
>>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "elixir-lang-core" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/elixir-lang-core/468649a3-7e6f-4214-99d8-6e8ef5e6d72an%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/elixir-lang-core/468649a3-7e6f-4214-99d8-6e8ef5e6d72an%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> --
>> You received this message because you are subscribed to the Google Groups
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/elixir-lang-core/47214770-475d-4499-a13e-3d7077d4e614n%40googlegroups.com
>> <https://groups.google.com/d/msgid/elixir-lang-core/47214770-475d-4499-a13e-3d7077d4e614n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4Km4hiN1CB%3DfTKAsnyo1jf_tT%3D1r8pmx%2BQqw_mPVsip2A%40mail.gmail.com
> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4Km4hiN1CB%3DfTKAsnyo1jf_tT%3D1r8pmx%2BQqw_mPVsip2A%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CADwgC_CShve52pNXJCzbj8ERLekUW7PYSMtKck0yx8j8Zh4tbw%40mail.gmail.com.

Reply via email to