Why? How Enum.drop/2 is related to Enum.filter/2? They are doing completely different things.
четверг, 15 августа 2019 г., 13:37:07 UTC+3 пользователь Andrea Leopardi написал: > > We should also address the fact that if we add Map.filter/2, we also > likely have to add Map.drop/2 (to mimic Enum and Stream), but that name is > already taken. > > On Thu, 15 Aug 2019 at 12:26, Johanna Larsson <[email protected] > <javascript:>> wrote: > >> The stream version is by far the slowest, which isn't surprising since >> streams bring some overhead. Didn't measure memory usage though >> https://gist.github.com/joladev/2b51260107078a1fc7f9d4504916fe21 >> >> Honestly, I tend to agree it would be nice to add it, for feature >> completeness, even if it doesn't improve performance hugely. I understand >> the desire to avoid unnecessary clutter in the core language, but this is a >> core erlang function that we're explicitly not wrapping, when most of the >> other ones are wrapped. And most likely just because it wasn't around from >> the start. It's quite a bit more ergonomic to use `Map.filter` rather than >> `for` or `map|>Enum.filter(pred)|>Enum.into({})`. Much cleaner. >> >> Not too hard to implement your own version of `Map.filter` though, so I >> don't feel too strongly about it. >> >> On Thu, Aug 15, 2019 at 11:12 AM Alexei Sholik <[email protected] >> <javascript:>> wrote: >> >>> The simplest alternative is to use :maps.filter(). It's not as easy to >>> pipe into, but that's a minor concern for me. >>> >>> As another alternative, this should be faster and have lower memory >>> footprint than using Enum, although you'd need to benchmark it as well to >>> be sure: >>> >>> map >>> |> Stream.filter(predicate) >>> |> Map.new() >>> >>> Personally, I would love to see an extension for Map.new() that would >>> allow filtering the first argument in addition to the currently supported >>> transformation. So instead of the current >>> >>> Map.new(enumerable, fn thing -> {key, val} end) >>> >>> we could have >>> >>> Map.new(enumerable, map: fn thing -> {key, val} end, filter: fn {_key, >>> val} -> predicate(val) end) >>> >>> Such an extension is unlikely to be added though because it would be >>> another way of doing what is already possible with Enum, Stream, and Map. >>> >>> On Thu, Aug 15, 2019 at 10:29 AM Roman Smirnov <[email protected] >>> <javascript:>> wrote: >>> >>>> Since OTP 18 there is a pretty convenient function :maps.filter >>>> <http://erlang.org/doc/man/maps.html#filter-2>. >>>> >>>> I think it would be nice to have Map.filter(map, predicate) in Elixir >>>> as well instead of doing >>>> >>>> >>>> map|> Enum.filter(predicate)|> Enum.into(%{}) >>>> >>>> >>>> or >>>> >>>> for {key, value} <- map, some_filter(key, value), into: %{}, do: {key, >>>> value} >>>> >>>> The first one alternative is slower, b/c of 2-step transformation, and >>>> the second one consume more memory, could not be piped and has a lack >>>> of expressiveness (too imperative way to do a simple filtration). >>>> There were benchmarks and a small discussion in PR: >>>> https://github.com/elixir-lang/elixir/pull/9292, but the discussion >>>> should be moved to this mailing list. >>>> >>>> >>>> -- >>>> 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] <javascript:>. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/elixir-lang-core/5d403c4a-91f8-4c4d-8dc0-297185a2aed8%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/elixir-lang-core/5d403c4a-91f8-4c4d-8dc0-297185a2aed8%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] <javascript:>. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/elixir-lang-core/CAAPY6eO5aDifRxHxv7QtD4%3Di_bYbUw1sphxMhq4jEjuR9naPSQ%40mail.gmail.com >>> >>> <https://groups.google.com/d/msgid/elixir-lang-core/CAAPY6eO5aDifRxHxv7QtD4%3Di_bYbUw1sphxMhq4jEjuR9naPSQ%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] <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/elixir-lang-core/CAKL9qdTxQWdKDM7B%3D1XLkf7w9PeshpfSyrpsuhM%3DeaEqdZVSDA%40mail.gmail.com >> >> <https://groups.google.com/d/msgid/elixir-lang-core/CAKL9qdTxQWdKDM7B%3D1XLkf7w9PeshpfSyrpsuhM%3DeaEqdZVSDA%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> > -- > > Andrea Leopardi > [email protected] <javascript:> > -- 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/c819a8cc-c3b6-41cc-a056-76a294b79fb6%40googlegroups.com.
