이것은지도와 접힘을 설명하는 데 도움이되는 보충 답변입니다. 아래 예에서는이 목록을 사용하겠습니다. 이 목록은 변경할 수 없으므로 변경되지 않습니다.
var numbers = [1, 2, 3, 4, 5]
예제에서 숫자를 사용하면 코드를 쉽게 읽을 수 있으므로 사용할 것입니다. 폴드는 전통적인 명령형 루프가 사용될 수있는 모든 것에 사용될 수 있습니다.
지도는 무언가의 목록 및 기능을 소요하고 기능을 사용하여 수정 된 목록을 반환합니다. 각 항목은 함수에 전달되고 함수가 반환하는 모든 항목이됩니다.
가장 쉬운 예는 목록의 각 숫자에 숫자를 추가하는 것입니다. 의사 코드를 사용하여 언어에 관계없이 사용합니다.
function add-two(n):
return n + 2
var numbers2 =
map(add-two, numbers)
를 인쇄 numbers2
하면 [3, 4, 5, 6, 7]
각 요소에 2가 추가 된 첫 번째 목록이 표시됩니다. 사용할 함수 add-two
가 주어졌습니다 map
.
접기 기능은 두 가지 인수를 가져와야 한다는 점을 제외하면 비슷합니다. 첫 번째 인수는 일반적으로 누산기 (왼쪽 접힘)가 가장 일반적입니다. 누산기는 루핑하는 동안 전달되는 데이터입니다. 두 번째 인수는 목록의 현재 항목입니다. map
기능에 대해서는 위와 같습니다 .
function add-together(n1, n2):
return n1 + n2
var sum =
fold(add-together, 0, numbers)
인쇄 sum
하면 숫자 목록의 합계가 표시됩니다. 15.
다음과 같은 주장을 fold
해야합니다.
이것이 우리가 접는 기능입니다. 접기는 함수에 현재 누산기와 목록의 현재 항목을 전달합니다. 함수가 반환하는 것이 무엇이든 새로운 누산기가되고 다음에 함수에 전달됩니다. FP 스타일을 반복 할 때 값을 "기억"하는 방법입니다. 나는 2 개의 숫자를 취해 더하는 함수를주었습니다.
이것은 초기 누산기입니다. 목록의 항목이 처리되기 전에 누산기가 시작되는 것. 숫자를 합산 할 때 숫자를 더하기 전에 총계는 얼마입니까? 0, 두 번째 인수로 전달했습니다.
마지막으로지도와 마찬가지로 처리 할 숫자 목록도 전달합니다.
접힌 부분이 여전히 이해가되지 않는다면 이것을 고려하십시오. 당신이 쓸 때 :
# Notice I passed the plus operator directly this time,
# instead of wrapping it in another function.
fold(+, 0, numbers)
기본적으로 전달 된 함수를 목록의 각 항목 사이에 놓고 왼쪽 또는 오른쪽에 초기 누적기를 추가합니다 (왼쪽 또는 오른쪽 접기의 경우에 따라 다름).
[1, 2, 3, 4, 5]
된다 :
0 + 1 + 2 + 3 + 4 + 5
^ Note the initial accumulator being added onto the left (for a left fold).
15와 같습니다.
map
한 목록을 같은 길이의 다른 목록으로 바꾸려면를 사용하십시오 .
를 사용 fold
하면 번호 목록을 합산처럼, 하나의 값으로 목록을 설정하고자 할 때.
@Jorg가 주석에서 지적했듯이 "단일 값"은 숫자와 같은 단순한 것이 될 필요는 없습니다. 목록이나 튜플을 포함한 단일 객체 일 수 있습니다! 제가 실제로 접기를 클릭하는 방식은 접기의 관점 에서지도를 정의하는 것이 었습니다 . 누산기가 어떻게 목록인지 확인하십시오.
function map(f, list):
fold(
function(xs, x): # xs is the list that has been processed so far
xs.add( f(x) ) # Add returns the list instead of mutating it
, [] # Before any of the list has been processed, we have an empty list
, list)
솔직히 말해서, 일단 각각을 이해하면 거의 모든 루핑이 접기 또는 맵으로 대체 될 수 있음을 알게 될 것입니다.