** (BadMapError) expected a map, got: #Function<7.126501267/1 in :erl_eval.expr/5>

Given:

data = 
[nil, nil, nil, "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", nil]
iex(17)> :maps.filter(data, & !is_nil(&1))
** (BadMapError) expected a map, got: #Function<7.126501267/1 in :erl_eval.expr/5>
    (stdlib 3.12.1) maps.erl:200: :maps.filter([nil, nil, nil, "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", nil], #Function<7.126501267/1 in :erl_eval.expr/5>)

Where is this #Function<7.126501267/1 coming from? I typically see this when using Stream but that’s not being used here. As far as I can see, all that’s being sent to :maps.filter is a simple list. What am I missing?

:wave:

:maps.filter probably expects the function as the first argument and data – second.

Try :maps.filter(& !is_nil(&1), data). Or since data in your case is not a map but a list, you can try Enum.filter(data, & !is_nil(&1)) or Enum.reject(data, &is_nil/1).

1 Like

#Function<7.126501267/1 is & !is_nil(&1) :slight_smile:

1 Like
iex(2)> :maps.filter(& !is_nil(&1), data)
** (BadMapError) expected a map, got: [nil, nil, nil, "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", nil]
    (stdlib 3.12.1) maps.erl:200: :maps.filter(#Function<7.126501267/1 in :erl_eval.expr/5>, [nil, nil, nil, "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", nil])

Thanks for the suggestion :slight_smile:

Why is it still failing?

:maps functions work on maps, not lists. When working with lists, I’d probably use Enum module.

1 Like
data = 
%{a: nil, b: nil, c: nil, d: "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", e: nil}

iex(7)> :maps.filter(& !is_nil(&1), data)
** (ArgumentError) argument error
    (stdlib 3.12.1) maps.erl:200: :maps.filter(#Function<7.126501267/1 in :erl_eval.expr/5>, %{a: nil, b: nil, c: nil, d: "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", e: nil})

What’s this error message trying to say?

That your passed in predicate is not of correct “shape”

The :maps.filter/2 expects the predicate to be of arity 2 and return a boolean:

Pred = fun((Key, Value) -> boolean())

In elixir this means roughly:

pred :: fun((key, value) -> boolean)
1 Like

Given:

data = 
%{a: nil, b: nil, c: nil, d: "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p", e: nil}

Solution:

:maps.filter(fn(_k, v) -> !is_nil(v) end, data)

Thank you and everyone else for your kindly assistance! :slight_smile: