JavaScript 기반 함수 식 프로 그래 밍 개념 설명

원문 주소 번역자 의 Github 시리즈 글 주소
함수 식 프로 그래 밍 용어 해석
본 논문 의 주요 목적 은 바로 통속 적 이 고 이해 하기 쉬 운 방식 으로 함수 식 프로 그래 밍 에서 흔히 볼 수 있 는 이론 용어 개념 을 논술 하 는 것 이다.
아 리 티: 매개 변수 수
Arity 대 는 한 함수 의 매개 변수 수량 을 말 합 니 다. 이 키 워드 는 unary, binary, ternary 등 과 유사 하고 두 개의 접미사 -ary, -ity 로 구성 되 어 있 습 니 다.예 를 들 어 한 함수 가 두 개의 인 자 를 입력 할 수 있다 면 이른바 binary function (이원 함수) 또는 두 개의 인자 가 있 는 함수 라 고 부른다.가끔 이런 함수 도 라틴 문법 을 좋아 하 는 사람 에 게 'dyadic (2 가 의)' 함수 라 고 불 린 다.이런 식 으로 추정 하면 부정 확 한 매개 변수의 방정식 도 variadic( ) 이 라 고 불 린 다.
const sum = (a, b) => a + b;

const arity = sum.length;
console.log(arity);
// => 2
// The arity of sum is 2

Higher - Order 함수 (HOF): 고등 함수
어떤 함 수 를 매개 변수 로 받 는 함수 가 고등 함수 가 되 며, 이 함 수 는 한 함수 로 되 돌아 갈 수도 있 고, 다른 유형 으로 되 돌아 갈 수도 있다.
const filter = (pred, xs) => {
  const result = [];
  for (var idx = 0; idx < xs.length; idx += 1) {
    if (pred(xs[idx])) {
      result.push(xs[idx]);
    }
  }
  return result;
};
const is = type => x => Object(x) instanceof type;
filter(is(Number), [0, '1', 2, null]); //=> [0, 2]

부분 응용 프로그램: 부분 패키지
원래 다 중 매개 변수의 함 수 를 고정 매개 변수의 함수 로 봉 하 는 과정 을 Partial Application 이 라 고 합 니 다.
let sum = (a, b) => a + b;

// partially applying `a` to `40`
let partial = sum.bind(null, 40);

// Invoking it with `b`
partial(2); //=> 42

Currying
하나의 N 매개 변수의 함 수 를 N 개의 일원 함수 의 조합 으로 변환 합 니 다. Currying 과 Partial Application 의 차 이 는 Partial Application 이 최종 적 으로 생 성 한 함수 가 여러 개의 값 을 받 을 수 있 도록 하 는 것 입 니 다. Currying 이 생 성 한 함수 시퀀스 의 모든 함 수 는 하나의 매개 변수 만 받 을 수 있 습 니 다.
let sum = (a, b) => a + b;

let curriedSum = (a) => (b) => a + b;

curriedSum(40)(2) // 42.

구성: 조합
디자인 모드 의 Decorator 처럼 느껴 집 니 다. 즉, 두 가지 지정 한 유형 을 조합 하여 새로운 값 의 함수 로 바 꿀 수 있 습 니 다.
가장 흔히 볼 수 있 는 조합 은 흔히 볼 수 있 는 함수 조합 입 니 다. 서로 다른 함 수 를 단일 값 으로 되 돌려 주 는 함수 로 조합 할 수 있 습 니 다.
const compose = (f, g) => a => f(g(a)) // Definition
const floorAndToString = compose((val)=> val.toString(), Math.floor) //Usage
floorAndToString(121.212121) // "121"

순수 함수
부작용 이 없고 반환 값 은 입력 에 의 해 결 정 된 함수 만 순수 함수 가 됩 니 다.
let greet = "yo";

greet.toUpperCase(); // YO;

greet // yo;

As opposed to:
let numbers = [1, 2, 3];

numbers.splice(0); // [1, 2, 3]

numbers // []

부작용: 부작용
함수 가 있 으 면 반환 값 을 제외 하고 다른 상 태 를 수정 하거나 외부 함수 등 과 관측 가능 한 상호작용 을 할 수 있 습 니 다.
console.log("IO is a side effect!");

Idempotency: 멱 등 성
여러 번 실행 해도 부작용 이 생기 지 않 는 함 수 를 멱 등 성 을 가 진 함수 라 고 부른다f(f(x)) = f(x) Math.abs(Math.abs(10))
Point-Free Style
선형 으로 정 의 된 매개 변수 가 없 는 함수 스타일 을 Point - Free Style 이 라 고 하 는데 이 유형 은 currying 이나 Higher - Order functions 가 필요 합 니 다.
// Given
let map = fn => list => list.map(fn);
let add = (a, b) => a + b;

// Then

// Not points-free - `numbers` is an explicit parameter
let incrementAll = (numbers) => map(add(1))(numbers);

// Points-free - The list is an implicit parameter
let incrementAll2 = map(add(1));
incrementAll 은 매개 변수 numbers 를 명 확 히 규정 하고 incrementAll2 는 매개 변수 에 대한 패키지 이 며 명시 적 설명 numbers 매개 변수 가 없 기 때문에 Points Free 라 고 할 수 있다.일반적으로 Points - free 의 함 수 는 흔히 볼 수 있 는 function 또는 => 키워드 로 정의 되 지 않 습 니 다.
Contracts
잠시 없다
Guarded Functions
잠시 없다
카 테 고리: 분류
일부 규칙 을 따 르 는 함수 의 대상, 예 를 들 어 monoid
가치: 값
계산 에서 자주 사용 되 는 복합 값 (complex) 이나 단순 값 (primitive) 은 함 수 를 포함한다.일반적으로 함수 식 프로 그래 밍 의 값 은 모두 가 변 값 으로 여 겨 진다.
5
Object.freeze({name: 'John', age: 30}) // The `freeze` function enforces immutability.
(a) => a

예 를 들 어 Functor, Monad 와 같이 다른 값 을 포함 하 는 구조 체 자체 도 값 입 니 다. 이것 은 바로 이러한 복합 값 도 서로 포함 할 수 있다 는 것 입 니 다.
상수: 상수
하나의 값 에 대한 가 변 적 인 인용 은 변수 와 혼동 해 서 는 안 된다.Variable 은 임의의 지점 에서 변경 할 수 있 는 인용 을 가리킨다.
const five = 5
const john = {name: 'John', age: 30}

상수 는 일반적으로 투명 하 다 고 여 긴 다. 즉, 그것들 은 값 자체 에 의 해 대체 되 고 최종 계산 결과 에 영향 을 주지 않 으 며 위의 두 상수 도 다음 과 같은 방식 으로 표현 할 수 있다.
john.age + five === ({name: 'John', age: 30}).age + (5)

상술 한 표현 식 은 계속 진실 을 되 돌려 줍 니 다.
Functor
Functor 는 map 함 수 를 인용 할 수 있 는 대상 을 가리 키 며, 자 바스 크 립 트 에서 가장 간단 한 함 수 는 Array 이다.
[2,3,4].map( n => n * 2 ); // [4,6,8]

가설 func 구 조 는 하나의 실현 map 함수 의 대상 이 고 f, g 은 임 의 함수 이 며 func 다음 과 같은 규칙 을 따 르 면 func 을 하나의 functor: Let func be an object implementing a map function, and f, g be arbitrary functions, then func 이 라 고 부 를 수 있다. is said to be a functor if the map function adheres to the following rules:
func.map(x => x) == func

그리고
func.map(x => f(g(x))) == func.map(g).map(f)

우리 가 Array 를 Functor 라 고 부 르 는 것 도 다음 과 같은 규칙 을 따 랐 기 때문이다.
[1, 2, 3].map(x => x); // = [1, 2, 3]

그리고
let f = x => x + 1;
let g = x => x * 2;

[1, 2, 3].map(x => f(g(x))); // = [3, 5, 7]
[1, 2, 3].map(g).map(f);     // = [3, 5, 7]

Pointed Functor of 방법 을 실현 한 Functor, Of 모든 단 치 를 하나의 Functor 로 전환 합 니 다.
Pointed Functor 가 Array 에서 의 실현 은:
  Array.prototype.of = (v) => [v];
  
  [].of(1) // [1]

Lift
Lift 는 map 과 유사 하지만 여러 Functors 에 사용 할 수 있 습 니 다.
단일 값 함수 에서 맵 과 Lift 의 역할 은 일치 합 니 다.
lift(n => n * 2)([2,3,4]); // [4,6,8]

Lift 는 여러 값 을 입력 할 수 있 습 니 다:
lift((a, b)  => a * b)([1, 2], [3]); // [3, 6]

참조 투명 성: 투명 참조
프로그램 표현 에 영향 을 주지 않 고 값 으로 직접 바 꿀 수 있 는 표현 식 을 투명 참조 라 고 합 니 다.
예 를 들 어 우 리 는 greet 라 는 인용 이 있다.
let greet = () => "Hello World!";
greet() 에 대한 모든 호출 은 Hello World! 직접 교체 할 수 있 기 때문에 greet 을 투명 인용 이 라 고 할 수 있다.
Equational Reasoning
표현 식 으로 조합 되 어 부작용 이 없 을 때 이 시스템 은 일부 에서 유도 할 수 있 습 니 다.
게 으 른 평가: 게 으 른 계산
레이 지 평가 란 어떤 값 이 필요 할 때 만 계산 하 는 메커니즘 이다.함수 식 언어 에서 이 기 제 는 무한 에 가 까 운 목록 을 조작 할 수 있 습 니 다.
let rand = function*() {
    while(1<2) {
        yield Math.random();
    }
}
let randIter = rand();
randIter.next(); // Each exectuion gives a random value, expression is evaluated on need.

Monoid: 특이 점
하나의 monoid 는 특정한 항등값 과 조합 한 후에 기 존 결과 에 영향 을 주지 않 는 데이터 형식 입 니 다.
가장 간단 한 모 노 이 드 는 다음 과 같다.
1 + 1; // 2

데이터 형식 은 number 이 고 함 수 는 +:
1 + 0; // 1

항등식 의 값 은 0 이 고 0 를 그 어떠한 수 와 더 해도 값 이 바 뀌 지 않 습 니 다.때때로 monoid 유형 이 서로 다른 교환 작업 을 해도 결과 에 영향 을 주지 않 습 니 다.
1 + (2 + 3) == (1 + 2) + 3; // true

배열 연결 도 monoid 라 고 볼 수 있 습 니 다.
[1, 2].concat([3, 4]); // [1, 2, 3, 4]

항등값 은 빈 배열 입 니 다. []
[1, 2].concat([]); // [1, 2]

Monad
하나의 Monad 는 ofchain 함 수 를 가 진 대상 이다.Chain 맵 과 유사 하지만 최종 적 으로 구 하 는 플러그 인 결 과 를 편평 하 게 만 들 수 있 습 니 다.
['cat,dog','fish,bird'].chain(a => a.split(',')) // ['cat','dog','fish','bird']

//Contrast to map
['cat,dog','fish,bird'].map(a => a.split(',')) // [['cat','dog'], ['fish','bird']]

You may also see of and chain referred to as return and bind (not be confused with the JS keyword/function...) in languages which provide Monad-like constructs as part of their standard library (e.g. Haskell, F#), on Wikipedia and in other literature. It's also important to note that return and bind are not part of the Fantasy Land spec and are mentioned here only for the sake of people interested in learning more about Monads.
Comonad: 나머지extractextend 함수 의 대상 을 실현 했다.
let CoIdentity = v => ({
    val: v,
    extract: this.v,
    extend: f => CoIdentity(f(this))
})

Extract 는 Functor 에서 값 을 뱉 을 수 있 습 니 다:
CoIdentity(1).extract() // 1

Extend 는 Commonad 와 같은 값 의 함 수 를 되 돌려 줍 니 다.
CoIdentity(1).extend(co => co.extract() + 1) // CoIdentity(2)

Applicative (적용 가능) Functor
하나의 Applicative Functor 는 ap 함 수 를 실현 한 대상 입 니 다. Ap 어떤 대상 의 특정한 값 을 다른 대상 의 같은 유형의 값 으로 바 꿀 수 있 습 니 다.
[(a)=> a + 1].ap([1]) // [2]

Morphism: 태사
전환 함수
Isomorphism: 동 태 전환
서로 다른 방식 으로 저 장 된 동일 한 데이터 의 변환 을 나 타 낼 수 있다
예 를 들 어 2 차원 배열 은 배열 로 저장 할 수 있다. [2,3] 또는 대상: {x: 2, y: 3}.
// Providing functions to convert in both directions makes them isomorphic.
const pairToCoords = (pair) => ({x: pair[0], y: pair[1]})

const coordsToPair = (coords) => [coords.x, coords.y]

coordsToPair(pairToCoords([1, 2])) // [1, 2]

pairToCoords(coordsToPair({x: 1, y: 2})) // {x: 1, y: 2}

Setoid equals 함수 의 대상 을 실현 했다. 즉, 다른 대상 과 비교 하여 같은 유형 에 속 하 는 지 판단 할 수 있 고 Setoid 라 고 불 린 다.
다음 프로 토 타 입 확장 은 Array 를 Setoid 로 바 꿀 수 있 습 니 다.
Array.prototype.equals = arr => {
    var len = this.length
    if (len != arr.length) {
        return false
    }
    for (var i = 0; i < len; i++) {
        if (this[i] !== arr[i]) {
            return false
        }
    }
    return true
}

[1, 2].equals([1, 2]) // true
[1, 2].equals([0]) // false

세 미 그룹: 반군
하나의 소유 concat 는 다른 대상 을 같은 유형의 함수 로 전환 시 키 고 함수 의 대상 을 Semigroup 이 라 고 부른다.
[1].concat([2]) // [1, 2]

Foldable: 접 을 수 있 음
reduce 함 수 를 실 현 했 습 니 다. 즉, 한 대상 을 다른 유형의 함수 로 바 꿀 수 있 는 대상 을 Foldable 대상 이 라 고 합 니 다.
let sum = list => list.reduce((acc, val) => acc + val, 0);
sum([1, 2, 3]) // 6

Traversable
잠시 없다
서명 유형: 형식 서명
일반적으로 함 수 는 매개 변수 유형 과 반환 값 유형 을 설명 합 니 다.
// functionName :: firstArgType -> secondArgType -> returnType

// add :: Number -> Number -> Number
let add = x => y => x + y

// increment :: Number -> Number
let increment = x => x + 1

만약 한 함수 가 다른 함 수 를 매개 변수 로 받아들인다 면, 예 를 들 어 다음 과 같다.
// call :: (a -> b) -> a -> b
let call = f => x => f(x)

여기 a, b, c, d 는 매개 변 수 를 임 의 유형 으로 표시 하지만 유형 a 을 다른 유형 b 으로 바 꿉 니 다. 아래 맵 에 대한 설명 은 a 형식의 목록 을 입력 한 다음 에 b 형식 을 포함 한 다른 목록 으로 바 꿉 니 다.
// map :: (a -> b) -> [a] -> [b]
let map = f => list =>  list.map(f)

좋은 웹페이지 즐겨찾기