2016-07-31 2 views

답변

3

[]으로 감쌀 필요가 없습니다.

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

[1..10]의 범위 1..10 동일한 제 1 길이 요소의 목록이다.


내가이 같은 Enum.flat_map을 사용, 숫자 및 범위를 포함하는 목록을 필터링하려면 :

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

아, 그건 의미가 있습니다. 그런데 범위 요소가있는 필터를 목록에 전달하려면 어떻게해야합니까? 예 : 위 목록과 같이 필터링하고자하는리스트는'list = [1..10, 2, 3]'입니다. – Bala

+0

'Enum.to_list (1..10) ++ [2, 3]'을 사용하여 이것을 flat list로 변환하여 전달하거나'Enum.flat_map'으로 전환하고'Enum.filter'를 실행하면됩니다. 항목이 범위라면 그렇지 않으면 항목이 숫자 인 경우'[]'또는'[x]'를 반환합니다. – Dogbert

+0

두 번째 방법의 구현을 추가했습니다. – Dogbert

2

당신이 읽을 수의 범위를 만들 때 단지 ()를 사용, 괄호를 사용합니다. 당신의 예에서

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

가장 읽을 수있는 솔루션입니다 :

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

둘째로'Enum.filter (is_even)'만 할 수 있습니다. :) – Dogbert

+0

@ Dogbert : 두 번째 명령에서 '&, & 1'이 없이는 어떻게 작동하는지 포인터를 넣을 수 있다면 감사하겠습니까. 내 말은 언제 '&'가 필요한지,하지 않을 때는 언제입니까? – Bala

+1

@Bala'Enum.filter'는 익명의 함수, 즉'fn ... end'를 요구합니다. '&'문법은 모듈의 함수를 익명의 함수로 변환하는 데 사용됩니다. 이 경우'is_even'은 이미 익명의 함수입니다. '& is_even. (& 1)'은 중복되어'is_even'과 동일합니다. – Dogbert

관련 문제