올바른 대답이 문제의 핵심을 다루는 것은 아니지만 지금까지는 답변이 제공됩니다. 문제의 핵심은 후드 아래에서 Enum.each
, Enum.map
, for x <- a
등을 구현하는 방법에 익숙하지 않다는 것입니다. 후드
Enum.map
두 입력 받아 재귀 함수 뿐이다 :
- 목록
- 그 목록 내의 각 소자에인가해야하는 기능을
이 재귀 함수의 반환 값은 새로운 목록입니다.
더욱를 명확히하기 위해 :
defmodule MyEnum do
def map(list, fun) do
if Enum.empty?(list) do
[] # Null case reached, stop recursing.
else
[head | tail] = list # obtain the first element in the list, assign that value to `head`. Store the remaining list inside the variable `tail`
projected_value = fun.(head) # This is where your function gets applied
[ projected_value | map(tail, fun)] # Recurse
end
end
end
: fn e -> e * 2 end
다음 새 목록 [2, 4, 6, 8]
Enum.map
간단하게 다음과 같이 구현 될 수를 얻을 것이다 : 당신이 입력으로 목록 [1, 2, 3, 4]
과 기능을 갖고 있다고 따라서 MyEnum.map([1,2,3], fn e -> e * 2 end)
은 목록을 반환합니다 : [2, 4, 6]
이제 fu 여기서 IO.puts/2
과 같이 : MyEnum.map([1,2,3], fn e -> IO.puts(e) end)
, 변수 projected_value
은 결국 IO.puts/2
의 반환 값이됩니다. 값을 화면에 인쇄하고 :ok
원자를 반환합니다.
즉,이 경우 작성한 목록은 각각의 새로운 재귀에 대해 원자 :ok
을 누적한다는 의미입니다.
이해력이있는 for x <- a
은 Enum.map과 비슷하지만 제공된 함수를 목록의 각 요소에 적용하는 재귀 함수이지만 다른 구문을 사용합니다.
Enum.each
도 후드 아래의 재귀 함수이지만, 모든 요소를 반복하므로 처리 중에 아무 것도 축적하지 않습니다. 당신이 볼 수 있듯이,이 함수는 항상 :ok
을 반환하고 Enum.map
항상 새로운 목록을 반환합니다
defmodule MyEnum do
def each(list, fun) do
if Enum.empty?(list) do
:ok # Return `:ok` to communicate the entire list has been traversed
else
[head | tail] = list
fun.(head) # Only apply the function to the element of the list, and do not care about its return value
each(tail, fun) # Continue to traverse the list recursively
end
end
end
: 이것은 당신이 그것을 구현할 수있는 방법이다.
이 모든
때문에, 초등학교 물건입니다 :
- 당신은 후드와에서 무슨 일이 일어나고 있는지 이해한다면,
- 당신은 본질적으로
Enum.map
및 for x <- [1,2,3]
는 기본적으로 하나의 단지 다른 인터페이스 모든 질문에 명확히해야한다
|>
와 같은 재귀 함수 것으로 알고 있습니다.
또한, 동일한 구조가 Javascript
에도 제공됩니다. JS에서 [1,2,3,4].map
또는 [1,2,3,4].each
을 수행하는 경우 Elixir
과 똑같은 작업을 수행하므로 차이점을 이해하는 데 여전히 문제가있는 경우 먼저 Javascript
에서 이러한 구문을보다 명확하게 이해할 수 있습니다.
['IO. inspect/2'] (https://hexdocs.pm/elixir/IO.html#inspect/2)는 전달 된 인수를 반환합니다. ['IO.puts/2'] (https://hexdocs.pm/elixir/IO.html#puts/2)는': ok'를 반환합니다. – mudasobwa
@ mudasobwa 감사합니다. –
@KevinJohnson 자바 스크립트 :'var a = 10; arr = [1, 2, 3, 4, 5]; (i = 0; i <5; ++ i) {a = arr [i] + a} 결과는 다음과 같다. a = 25'The Elixir, a = 10; Enum.each (0..4, fn (x) -> a = arr [i] + a)'이 코드는 오류가 발생합니다. 'for <-0.4, a = Enum.at (arr, i) + a' 이것은 하나의 값이 아닌리스트를 반환합니다. 어떻게하면 자바 스크립트에서와 같은 결과를 얻을 수 있습니까? 고맙습니다 ! – clicli