JavaScript의 무한 데이터 구조 및 지연 평가

Haskell's lazy evaluation은 사용자가 문제를 보다 쉽게 ​​분석할 수 있도록 하는 이 기능적 언어의 강력한 도구입니다.

오늘은 생성기 함수를 사용하여 무한 배열을 구현하여 지연 평가를 활용하는 방법을 보여 드리겠습니다.

생성기 기능




function* from(start) {
    while (true) {
        yield start;

        start++;
    }
}

console.log(from(5)); // ???


이 코드가 무엇을 출력할 것이라고 생각합니까? 처음에는 from 함수 내부에 무한 루프를 만드는 것처럼 보입니다. 따라서 이 스크립트가 정지되고 중단될 것이라고 말하는 것이 논리적으로 보입니다. 하지만 그렇지 않습니다. 제너레이터 기능 덕분입니다. 다음은 출력입니다.

Object [Generator] {}


제너레이터 함수는 필요할 때만 값을 반환하는 특별한 종류의 함수입니다. 이것은 Haskell의 게으른 평가와 비슷합니다. 상황은 필요할 때만 평가됩니다.

가져가다



그러나 무한 생성기는 그것에서 어떤 값을 얻을 수 없다면 무의미할 것입니다. 그리고 이 생성기 함수는 반복자를 반환하므로 이러한 데이터 구조를 처리할 수 있는 함수가 필요합니다.

이것이 우리가 이것을 처리하는 함수를 만들어야 하는 이유입니다. take 함수를 직접 구현하여 Haskell에서 개념을 뻔뻔하게 훔치고 있습니다.

function take(count, generator) {
    const result = [];

    while (count--) {
        result.push(generator.next().value);
    }

    return result;
}

console.log(take(5, from(1))); // [ 1, 2, 3, 4, 5 ]


이 함수는 해당 무한 반복기에서 필요한 만큼의 값을 가져옵니다. 여기서는 5개 항목만 필요하므로 1부터 시작하는 5개 요소의 배열을 반환합니다.

합집합



바라보다! 이제 우리에게 익숙한 것이 있습니다. 간단한 배열입니다. 요약하는 간단한 함수를 만들어 봅시다!

function sum(array) {
    return array.reduce((total, number) => total + number);
}

console.log(sum(take(5, from(1)))); // 15


이것은 배열이기 때문에 Array 프로토타입의 기능을 사용하고 이 배열의 합을 얻기 위해 reduce 메소드를 호출할 수 있습니다. 충분히 간단합니다.

이 간단한 기술을 사용하면 예를 들어 5부터 시작하는 처음 10개의 숫자의 합을 쉽게 계산할 수 있습니다.

console.log(sum(take(10, from(5)))); // 95


결론



생성기 함수를 사용하여 JavaScript에서 무한 목록인 흥미로운 데이터 구조를 구현하는 방법을 보았습니다. 반복자와 결합된 생성기 함수는 일단 마스터하면 JavaScript에서 사용하기에 정말 강력할 수 있는 개념입니다.

documentation 을 읽고 이 두 개념에 익숙해지는 것이 좋습니다.

발전기를 어떻게 사용합니까? 댓글 섹션에서 알려주십시오.

게을러 라!

좋은 웹페이지 즐겨찾기