2015-11-09 11 views
7

Próbuję odfiltrować niektóre wartości z mapy w eliksiru.Używanie potoku z filtrem i mapa w eliksiru

to:

params = %{"blah" => "blah", "vtha" => "blah"} 
params 
    |> Enum.filter fn {k, v} -> k == v end 
    |> Enum.map(fn {k, v} -> {k, v} end) 

Wynik w ten błąd: ** (FunctionClauseError) Brak funkcji dopasowywania klauzula w Enumerable.Function.reduce/3

ale obie operacje filtrów i map pracować w izolacji .

Enum.filter params, fn {k, v} -> k == v end 
Enum.map(params, fn {k, v} -> {k, v} end) 

Nie działają podczas instalacji rurowej.

Jestem pewien, że brakuje mi czegoś oczywistego.

Odpowiedz

11

EDIT Na oddziale mistrzowskiej Elixir, kompilator ostrzeże jeśli funkcja jest rurami do bez nawiasów, jeśli istnieją argumenty.


Trzeba wyraźny nawias dla Enum.filter jako wywołanie funkcji ma silniejszy priorytet niż operator rurociągu.

params = %{"blah" => "blah", "vtha" => "blah"} 
params 
    |> Enum.filter(fn {k, v} -> k == v end) 
    |> Enum.map(fn {k, v} -> {k, v} end) 

proszę zobaczyć Why Can't I Chain String.replace? dla bardziej szczegółowego wyjaśnienia.

+0

Dzięki! Wiedziałem, że to będzie coś oczywistego. :) –