JavaScript의 데이터 유형

JavaScript는 웹 개발을 위한 유일한 언어가 아닙니다.Elm 또는 PureScript 같은 다른 프로그래밍 패러다임 기반 언어도 사용할 수 있습니다.그것들은 함수식 프로그래밍에 의존하여 대다수 상황에서 유사한 개념을 가지고 있다.
그중의 한 개념은 데이터 유형이다.
물론, 이 언어의 문서를 읽어서 이 새로운 개념을 시도하고 파악할 수 있거나, 자바스크립트로 데이터 형식을 작성해서 어떻게 작동하는지 함께 이해할 수 있습니다.

그래서 오늘 우리는 우리 버전의 Maybe 데이터 형식을 디자인하고 그것을 어떻게 사용하는지 아주 간단한 예시를 볼 것이다.

문제.


값이나 결함을 나타내는 데 도움이 되는 데이터 형식일 수 있습니다.제법 함수를 보여 주세요.
function divide(numerator, denominator) {
    return numerator / denominator;
}
간단해.알다시피, 특수한 상황에서 분열된 모든 것이 번영한다.만약 우리가 0을 나누려고 시도한다면, 나누기 오류가 발생할 것이다.이 사건을 처리합시다.
function divide(numerator, denominator) {
    if (denominator === 0) {
        return... hm... what again?
    }

    return numerator / denominator;
}
그래.그게 문제야.우리는 정말 무엇을 돌려줘야 할지 모르겠다.물론, 우리는 이상을 던질 수 있다. 이 이상은 우리 사용자에게 남겨져 처리될 것이다.
function divide(numerator, denominator) {
    if (denominator === 0) {
        throw new Error("second argument cannot be zero");
    }

    return numerator / denominator;
}
또는 기본값을 제공하기 위해 다른 매개 변수를 사용할 수도 있습니다.
function divide(numerator, denominator, defaultValue) {
    if (denominator === 0) {
        return defaultValue;
    }

    return numerator / denominator;
}
그러나 우리는 이런 데이터 유형을 처리하는 또 다른 방법을 보게 될 것이다.

그렇게 지도 모른다, 아마, 아마...


실제로는 단지 용기일 수도 있다.그것은 자신의 진실한 자산을 숨기고 있는데, 이 자산들은 공정하고 아무런 가치도 없다.Just는 누락된 값이 아닌 존재를 나타내는 데 도움을 주는 데이터 구조입니다.이 점을 어떻게 실현하는지 봅시다.

This, of course, is my take at representing the Maybe data type in JavaScript. There can be other implementations. I'll let you do your researches if you need to see some other alternatives.


class Maybe {}

class Just extends Maybe {
    constructor() {
        super();
    }
}

class Nothing extends Maybe {
    constructor() {
        super();
    }
}
현재, 부류에서 두 개의 자류만 확장되어 온다.특히 TypeScript를 사용할 때 도움이 될 것입니다.우리의 함수는 항상 Maybe 실례를 되돌려줍니다.이것은 함수의 구현이 Just 인스턴스(값이 있을 때) 또는 Nothing 인스턴스(값이 없을 때)를 반환하는지 여부에 따라 달라집니다.
우리의divide 함수의 최종 실현은 아마도 이와 같을 것이다.
function divide(numerator, denominator) {
    if (denominator === 0) {
        return new Nothing();
    }

    return new Just(numerator / denominator);
}
마찬가지로 여기서 우리는 우리가 가능한 예를 얻었다고 확신한다.그러나 그것이 공정한 실례인지 불공정한 실례인지는 이 기능을 실현하는 사람에게 달려 있다.

다시 한 번, 만약 우리가 그것을 테스트한다면, 우리는 이 함수의 반환 값이 확실히 가능한 값이라는 것을 알게 될 것이다.
function divide(numerator, denominator) {
    if (denominator === 0) {
        return new Nothing();
    }

    return new Just(numerator / denominator);
}

const numerator     = 1;
const denominator   = 0;
const result        = divide(numerator, denominator);

console.log(result instanceof Maybe); // true
위대하다하지만 이것은 그리 유용하지 않다.우리는 이 예에 대해 무엇을 할 수 있어야 한다.예를 들어 우리는 우리가 이전에 보았던 제법 함수의 두 번째 정의와 같은 기본값을 얻을 수 있다.보충해 봅시다.
class Maybe {
    static withDefault(value, maybe) {
        if (maybe instanceof Just) {
            return maybe.getValue();
        }

        if (maybe instanceof Nothing) {
            return value;
        }

        throw new TypeError("second argument is not an instance of Maybe");
    }
}

class Just extends Maybe {
    constructor(value) {
        super();

        this.value = value;
    }

    getValue() {
        return this.value;
    }
}

class Nothing extends Maybe {
    constructor() {
        super();
    }
}
우리가 그곳에서 한 일은:
  • 우리 클래스에 정적 함수를 추가합니다.이것은 다음과 같은 상황을 처리할 것입니다.maybe 실례는 Just 실례 (이 용기에 포함된 값을 되돌려줍니다) 또는 Nothing (Nothing 용기에 추가 값이 없기 때문에 매개 변수로 전달된 기본값을 되돌려줍니다.)
  • Just constructor의 값을 추가합니다.이것이 바로 우리가 어떤 가치를 가능하게 하는 예이다.그리고 당연히 이 값을 얻는 방법이다.
  • 우리의'무'과정은 변하지 않습니다. 당신은 정말 행운입니다!
  • 이제 이런 정적 방법을 어떻게 사용하는지 예를 살펴보자.
    function divide(numerator, denominator) {
        if (denominator === 0) {
            return new Nothing();
        }
    
        return new Just(numerator / denominator);
    }
    
    const numerator     = 1;
    const denominator   = 0;
    const result        = Maybe.withDefault(0, divide(numerator, denominator));
    
    console.log(result); // 0
    
    예!일 1다른 값을 보여 주세요.
    function divide(numerator, denominator) {
        if (denominator === 0) {
            return new Nothing();
        }
    
        return new Just(numerator / denominator);
    }
    
    const numerator     = 5;
    const denominator   = 2;
    const result        = Maybe.withDefault(0, divide(numerator, denominator));
    
    console.log(result); // 2.5
    
    무슨 일이 일어났는지 보셨어요?우리는 분자와 분모만 바꿨다.이 값은 현재 2.5입니다. 이것은 예상 값입니다. 왜냐하면 이것은 제로법이 아니기 때문입니다.기본값이 트리거되지 않았습니다.

    왜?


    이렇게!이제 Maybe 데이터 유형을 구현했습니다.그런데 왜 이렇게 많은 코드가 기본값만 겨냥합니까?
    일치성
    JavaScript 및 기타 일부 언어에서는 함수가 예상 값을 반환하지 않음을 나타내는 여러 가지 방법을 사용할 수 있습니다.예를 들어, 제법 오류가 발생했을 때, 우리는 두 가지 종지 함수 방법을 보았다.그러나 수학적으로 정확하지 않아도 우리는 영만 되돌릴 수 있다.심지어null로 되돌아옵니다. (더 정확하지만 특정한 상황을 처리해야 합니다.)
    만약 당신이 사용한 코드가 제법 함수이고 이 함수를 읽으면Maybe 데이터 형식으로 되돌아온다면, 문서를 읽지 않고 처리해야 할 모든 특수한 상황을 읽을 필요가 없을 수도 있습니다. 왜냐하면 무슨 일이 발생하든지 간에 Maybe 값은 두 가지 값만 있을 수 있다는 것을 알고 있기 때문입니다. 제법의 결과 (Just) 는 없거나.
    여기는Haskell의 Maybe 데이터 형식에 대한 정의입니다. 이것은 또 다른 함수식 프로그래밍 언어입니다.
    data Maybe a
        = Just a
        | Nothing
    
    그 내용은 다음과 같다. a 값의 데이터 형식은 a 값일 수도 있고 아무것도 아닐 수도 있다.이런 상황에서 우리는 값으로 a를 바꿀 수 있다.
    data Maybe value
        = Just value
        | Nothing
    
    나는 이 판본을 특히 좋아한다. 왜냐하면 avalue는 완전히 해석할 수 있는 것이 아니기 때문이다.

    다른 용례


    예를 들어, 만약 공교롭게Fetch API를 사용하여 데이터를 API 서버에 보낸다면, 모든 응답 상황을 처리해야 한다는 것을 알게 될 것입니다.하지만 Maybe 데이터 형식을 사용하여 이 점을 실현할 수도 있습니다.
    async function update(user) {
        const NO_CONTENT = 204;
    
        const response = await fetch("https://api.website.com/users", {
            method: "PUT",
    
            headers: {
                "Content-Type": "application/json"
            },
    
            body: JSON.stringify(user)
        });
    
        if (response.status === NO_CONTENT) {
            return new Nothing();
        }
    
        const updatedUser = await response.json();
    
        return new Just(updatedUser);
    }
    
    현재, 만약에 우리가 사용자를 업데이트한다면, 우리는 작은 토스트 알림을 보내서 우리의 사용자 인터페이스를 강화할 수 있다. 예를 들어, '정보가 업데이트되었다', '업데이트할 필요가 없다'.
    const updatedUser = Maybe.withDefault(false, await update({ email: "[email protected]" }));
    
    if (updatedUser) {
        window.localStorage.setItem("user", JSON.stringify(updatedUser));
    
        window.alert("Informations updated");
    } else {
        window.alert("Nothing to do");
    }
    

    결론


    이제 JavaScript에서 Maybe 데이터 형식의 내부 기초를 이해함으로써 다른 함수식 언어에서 이 데이터 형식을 쉽게 처리할 수 있습니다.
    비록 매우 빈번하게 사용되지만, 이런 데이터 형식은 일부 중요한 정보가 부족하다.모든 오류를 개별적으로 처리할 필요가 없는 경우 완벽하지만, 개별적으로 처리해야 할 때 Maybe 데이터 형식을 사용할 수 없습니다.
    그럼 어때요?우리는 이 개념을 버리고 이상을 던지거나 문자열을 오류로 되돌려줍니다.아니요!다른 데이터 형식, 즉 임의의 데이터 형식을 사용할 수 있다.
    data Either a b
        = Left a
        | Right b
    
    이것은 독자에게 남겨진 연습이다. 데이터 형식 (JavaScript 또는 TypeScript) 을 제시하고 API에 데이터를 보내는 상하문에서 그것을 사용한다.틀린 답이 없다.이것은 단지 내가 호기심 때문에 지역 사회와 공유하는 도전일 뿐이다.

    읽어 주셔서 감사합니다. 만약 이 개념을 완전히 이해하지 못한다면, 평론 부분에서 문의하십시오.나도 내가 이 문장을 개선하는 것을 돕기 위해 비판을 받아들이고 싶다.만약 당신이 약간의 잘못을 보았다면, 평론 부분에서도 저에게 알려주세요.
    이제 용서해 주세요. 팔굽혀펴기 하러 갈게요.넷플릭스에 재밌는 프로그램이 없으면.
    data Maybe netflix
        = Just netflix
        | Pushups
    

    좋은 웹페이지 즐겨찾기