머리말 이전 글인 JavaScript의 일반적인 고차 함수에서는 몇 가지 일반적인 함수 함수를 주로 구현했습니다. 이 기사는 또한 마지막에 해당 구현이 F#과 같은 기능적 언어와 "다른" 이유는 무엇인지에 대한 질문을 제기했습니다. 오늘은 좀 더 "기능적인" 구현을 시도해 보겠습니다.
또 다른 구현 마찬가지로 이전에 구현한 함수를 일부 변경하고 for 루프를 제거해 보세요. 그것을 제거하는 방법? 여기서는 먼저 집합의 귀납적 정의를 소개합니다.
집합은 빈 집합이거나 숫자와 집합으로 구성된 숫자 쌍입니다. 정의에서 각 집합을 간주할 수 있음을 알 수 있습니다. 숫자와 쌍의 집합으로. 예를 들어, {1,2,4,5}는 숫자 1과 집합 {2,4,5}로 구성된 쌍으로 간주될 수 있으며 (1, {2,4,5})로 작성됩니다. 재귀적으로 {2,4,5}는 (2, {4,5})로 볼 수 있습니다. 마지막으로 (5, Ø)입니다. 이러한 이해를 바탕으로 재귀적 방법을 사용하여 루프를 제거할 수 있습니다. 왜냐하면 분해 중에 모든 데이터 항목을 방문했고 최종 조건은 공집합이기 때문입니다. 필터 함수의 또 다른 구현을 살펴보겠습니다. 원래 함수 이름에는 이전 함수와 구별하기 위해 f가 붙습니다.
function ffilter(arr,callback){
var i=arguments[2] || 0,
out = 인수[3 ] || [];
if (!arr[i]) return 인수[3];
if(callback(arr[i]))
out.push(arr[i]); 🎜>return 인수.callee(arr,callback , i,out);
}
테스트:
var arr = [1,2,3,4,5,6,7,8,9,10]; var even = function(item){
if( typeof item !== "number") return false
return !(item & 1)
console.log(ffilter( arr,even));
결과:
[2, 4, 6, 8, 10] 루프를 제거한 후 수학의 귀납적 정의에 더 가까워지고 더 자연스러워 보입니다. 마찬가지로 ffold 함수를 다시 살펴보세요.
var plus = function(a,b){
return a b;
console .log(ffold(arr,plus,3));
결과:
58
다른 기능에도 동일한 방법을 사용하세요. 이것이 더 기능적으로 느껴지지만 수학적 정의에 더 가깝다고 할 수 있을까요? 다음에 다시 시도해 보세요.
==========2013.1.8 업데이트==================
위에서 언급했듯이 글쓰기 방식이 에 더 가까워질 수 있는지 여부 수학적 정의는 연결리스트를 사용해 보도록 하겠습니다. 먼저 정의를 내리세요:
코드 복사
this.tail = null;
다른 연결 목록 초기화
:
코드 복사
n3.data=3,n3.tail=n4;
n4.data=4,n4.tail=n5;
n5.data=5,n5.tail=null; >
폴드 링크드 리스트 버전:
코드 복사
출력 결과:
18
이전 정의에 따르면 집합은 빈 집합이거나 "머리"와 "꼬리"로 구성된 쌍입니다. (세트). 함수가 호출될 때마다 집합이 빌 때까지 head와 tail로 분해됩니다(위의 lfold 함수를 작성하고 나니 정말 너무 완벽하다는 걸 느꼈습니다. 그냥 정의일 뿐입니다. 프로그램이 이렇게 생겼다면 거기에 코멘트가 필요하지 않습니다. 정말 기쁩니다. 이는 수학적 정의에 가장 가까운 표현입니다. JavaScript는 많은 기능적 언어 일치를 지원하지 않기 때문에 "자동으로" 분해할 수 없으며 귀납적 정의를 직접 표현할 수 없습니다.
위의 사항 외에도 JavaScript는 함수형 표현식에서 부분적 구현도 가능합니다. Dojo 프레임워크의 Hitch는 이 기능을 구현하며 함수형 표현식이 수학에 가깝다는 점을 보여줍니다. 이에 대해서는 다음 블로그에서 다루겠습니다.