Elixir-열거 형

열거 형은 열거 할 수있는 개체입니다. "열거"는 세트 / 컬렉션 / 카테고리의 구성원을 하나씩 (일반적으로 순서대로, 일반적으로 이름으로) 카운트하는 것을 의미합니다.

Elixir는 열거 형의 개념 과 함께 작동 하는 열거 형 모듈 을 제공합니다. Enum 모듈의 함수는 이름에서 알 수 있듯이 데이터 구조의 값을 열거하는 것으로 제한됩니다. 열거 가능한 데이터 구조의 예는 목록, 튜플, 맵 등입니다. Enum 모듈은 열거 형을 처리 할 수있는 100 개가 넘는 함수를 제공합니다. 이 장에서는 몇 가지 중요한 기능에 대해 설명합니다.

이러한 모든 함수는 열거 형을 첫 번째 요소로, 함수를 두 번째 요소로 사용하여 작업합니다. 기능은 아래에 설명되어 있습니다.

모두?

우리가 사용할 때 all? 함수를 사용하려면 전체 컬렉션이 true로 평가되어야합니다. 그렇지 않으면 false가 반환됩니다. 예를 들어 목록의 모든 요소가 홀수인지 확인하려면 다음을 수행하십시오.

res = Enum.all?([1, 2, 3, 4], fn(s) -> rem(s,2) == 1 end) 
IO.puts(res)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

false

이 목록의 모든 요소가 이상한 것은 아니기 때문입니다.

어떤?

이름에서 알 수 있듯이이 함수는 컬렉션의 요소가 true로 평가되면 true를 반환합니다. 예를 들면-

res = Enum.any?([1, 2, 3, 4], fn(s) -> rem(s,2) == 1 end)
IO.puts(res)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

true

큰 덩어리

이 함수는 컬렉션을 두 번째 인수로 제공되는 크기의 작은 덩어리로 나눕니다. 예를 들면-

res = Enum.chunk([1, 2, 3, 4, 5, 6], 2)
IO.puts(res)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

[[1, 2], [3, 4], [5, 6]]

마다

새 값을 생성하지 않고 컬렉션을 반복해야 할 수도 있습니다.이 경우에는 each 기능-

Enum.each(["Hello", "Every", "one"], fn(s) -> IO.puts(s) end)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

Hello
Every
one

지도

각 항목에 함수를 적용하고 새 컬렉션을 생성하기 위해 map 함수를 사용합니다. 표현력이 뛰어나고 짧기 때문에 함수형 프로그래밍에서 가장 유용한 구조 중 하나입니다. 이것을 이해하기위한 예를 고려해 보겠습니다. 목록에 저장된 값을 두 배로 늘리고 새 목록에 저장합니다.res

res = Enum.map([2, 5, 3, 6], fn(a) -> a*2 end)
IO.puts(res)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

[4, 10, 6, 12]

줄이다

그만큼 reduce함수는 열거 형을 단일 값으로 줄이는 데 도움이됩니다. 이를 위해 함수에 전달할 선택적 누산기 (이 예에서는 5)를 제공합니다. 누산기가 제공되지 않으면 첫 번째 값이 사용됩니다.

res = Enum.reduce([1, 2, 3, 4], 5, fn(x, accum) -> x + accum end)
IO.puts(res)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

15

누산기는 전달 된 초기 값입니다. fn. 두 번째 호출부터 이전 호출에서 반환 된 값이 accum으로 전달됩니다. 누산기없이 reduce를 사용할 수도 있습니다.

res = Enum.reduce([1, 2, 3, 4], fn(x, accum) -> x + accum end)
IO.puts(res)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

10

유니크

uniq 함수는 컬렉션에서 중복을 제거하고 컬렉션의 요소 집합 만 반환합니다. 예를 들면-

res = Enum.uniq([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
IO.puts(res)

위의 프로그램을 실행하면 다음과 같은 결과가 생성됩니다.

[1, 2, 3, 4]

열렬한 평가

Enum 모듈의 모든 기능은 열망합니다. 많은 함수는 열거 가능을 기대하고 목록을 다시 반환합니다. 즉, Enum으로 여러 작업을 수행 할 때 각 작업은 결과에 도달 할 때까지 중간 목록을 생성합니다. 이것을 이해하기 위해 다음 예를 고려해 보겠습니다.

odd? = &(odd? = &(rem(&1, 2) != 0) 
res = 1..100_000 |> Enum.map(&(&1 * 3)) |> Enum.filter(odd?) |> Enum.sum 
IO.puts(res)

위의 프로그램이 실행되면 다음과 같은 결과가 생성됩니다.

7500000000

위의 예에는 작업 파이프 라인이 있습니다. 범위로 시작한 다음 범위의 각 요소에 3을 곱합니다.이 첫 번째 작업은 이제 100_000 개의 항목이있는 목록을 만들고 반환합니다. 그런 다음 목록에서 모든 홀수 요소를 유지하여 50_000 개의 항목이있는 새 목록을 생성 한 다음 모든 항목을 합산합니다.

그만큼 |> 위의 스 니펫에 사용 된 기호는 pipe operator: 왼쪽의 표현식에서 출력을 가져 와서 오른쪽의 함수 호출에 첫 번째 인수로 전달합니다. Unix | 운영자. 그 목적은 일련의 기능에 의해 변환되는 데이터의 흐름을 강조하는 것입니다.

없이 pipe 연산자, 코드가 복잡해 보입니다.

Enum.sum(Enum.filter(Enum.map(1..100_000, &(&1 * 3)), odd?))

다른 많은 기능이 있지만 여기서는 몇 가지 중요한 기능 만 설명했습니다.