2016-07-31 8 views
0

Ist es möglich, einen Bereich zu Elixirs Enum.filter zu übergeben. Für z.B.Wie übergebe ich einen Bereich an Enum.filter in Elixir?

Dies funktioniert

[1,2,3,4,5] |> Enum.filter(&rem(&1,2)==0) #=> [2,4] 

Aber dies bedeutet nicht

[1..10] |> Enum.filter(&rem(&1,2)==0) #=> bad argument in arithmetic... 

Ich habe eine Liste einen Bereich enthält, die Ich mag würde zu filtern passieren. Z.B.

[1..10, 2, 3] 

Antwort

3

Sie müssen es nicht in [] wickeln.

iex(1)> 1..10 |> Enum.filter(&rem(&1,2)==0) 
[2, 4, 6, 8, 10] 

[1..10] ist eine Liste der Länge 1 mit dem ersten Elemente gleich den Bereich 1..10.


Um eine Liste mit Zahlen und Bereiche zu filtern, ich Enum.flat_map wie folgt verwenden würde:

iex(2)> [1..10, 2, 3] |> Enum.flat_map(fn 
...(2)> n when is_number(n) -> if rem(n, 2) == 0, do: [n], else: [] 
...(2)> enum -> Enum.filter(enum, &rem(&1, 2) == 0) 
...(2)> end) 
[2, 4, 6, 8, 10, 2] 
+0

Ach, das macht Sinn. Aber wie übergebe ich dann eine Filterliste mit einem Bereichselement? z.B. Hier ist meine Liste 'list = [1..10, 2, 3]', die ich wie oben beschrieben filtern möchte. – Bala

+0

Sie können das entweder in eine flache Liste konvertieren, indem Sie 'Enum.to_list (1..10) ++ [2, 3]' verwenden und diese übergeben, oder zu 'Enum.flat_map' wechseln und innerhalb dieses Laufs 'Enum.filter' Wenn das Element ein Bereich ist, geben Sie andernfalls '[]' oder '[x]' zurück, wenn das Element eine Zahl ist. – Dogbert

+0

Ich habe eine Implementierung der zweiten Methode hinzugefügt. – Dogbert

2

Wenn Sie Klammern verwenden möchten, wenn die Schaffung eines Bereichs für die Lesbarkeit, nur verwenden ().

(1..10) |> Enum.filter(&rem(&1,2)==0) 

In Ihrem Beispiel die lesbare Lösung ist:

# declare anonymous function for checking is number even 
is_even = &rem(&1,2) == 0 
(1..10) |> Enum.filter(&is_even.(&1)) 
+2

Im zweiten können Sie einfach '|> Enum.filter (is_even)'. :) – Dogbert

+0

@Dogbert: Würde mich freuen, wenn Sie in Pointers auf, wie es funktioniert, ohne "&, & 1" in der zweiten einwerfen. Ich meine, wann brauche ich '&' und wann nicht? – Bala

+1

@Bala 'Enum.filter' benötigt eine anonyme Funktion, d. H.' Fn ... end'. Die '&' Syntax wird verwendet, um die Funktion eines Moduls in eine anonyme Funktion umzuwandeln. In diesem Fall ist 'is_even' bereits eine anonyme Funktion. '& is_even. (& 1)' ist redundant und entspricht nur 'is_even'. – Dogbert