JavaScript 기반 함수 식 프로 그래 밍 개념 설명
11393 단어 함수 식 프로 그래 밍자바 script
함수 식 프로 그래 밍 용어 해석
본 논문 의 주요 목적 은 바로 통속 적 이 고 이해 하기 쉬 운 방식 으로 함수 식 프로 그래 밍 에서 흔히 볼 수 있 는 이론 용어 개념 을 논술 하 는 것 이다.
아 리 티: 매개 변수 수
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 는
of
와 chain
함 수 를 가 진 대상 이다.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: 나머지
extract
와 extend
함수 의 대상 을 실현 했다.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)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 8 함수 식 인터페이스 -- SupplierJAVA 8 함수 인터페이스 - Supplier JDK 8 부터 자바 는 함수 식 프로 그래 밍 을 지원 하고 JDK 도 자주 사용 하 는 함수 식 인 터 페 이 스 를 제공 합 니 다. 이 편 은 Supplier ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.