다형성의 목적은 무엇입니까?
다형성은 유형 동등성에 대한 조건을 완화하여 정적 유형 안전성을 잃지 않고 정적 유형 시스템을보다 유연하게 만듭니다. 프로그램은 유형 오류가없는 경우에만 실행된다는 증거가 있습니다.
다형성 함수 또는 데이터 유형은 더 넓은 범위의 시나리오에서 사용할 수 있기 때문에 단일형 함수보다 더 일반적입니다. 이러한 의미에서 다형성은 엄격하게 형식화 된 언어의 일반화 개념을 나타냅니다.
이것이 Javascript에 어떻게 적용됩니까?
Javascript에는 약하고 동적 유형 시스템이 있습니다. 이러한 유형 시스템은 하나의 유형 만 포함하는 엄격한 유형 시스템과 동일합니다. 이러한 유형을 거대한 공용체 유형 (의사 구문)으로 생각할 수 있습니다.
type T =
| Undefined
| Null
| Number
| String
| Boolean
| Symbol
| Object
| Array
| Map
| ...
모든 값은 런타임에 이러한 대체 유형 중 하나에 연결됩니다. 그리고 Javascript는 약한 유형이기 때문에 모든 값은 여러 번 유형을 변경할 수 있습니다.
유형 이론적 관점을 취하고 하나의 유형 만 있다고 생각하면 Javascript의 유형 시스템에는 다형성 개념이 없음을 확실하게 말할 수 있습니다. 대신 우리는 덕 타이핑과 암시 적 타입 강제를 가지고 있습니다.
그러나 이것이 우리 프로그램의 유형에 대해 생각하는 것을 막아서는 안됩니다. 자바 스크립트에는 타입이 없기 때문에 코딩 과정에서 유추해야합니다. 우리의 마음은 빠진 컴파일러에 대해 서 있어야합니다. 즉, 프로그램을 보자 마자 알고리즘뿐만 아니라 기본 (다형성) 유형도 인식해야합니다. 이러한 유형은보다 안정적이고 강력한 프로그램을 구축하는 데 도움이됩니다.
이 작업을 제대로 수행하기 위해 가장 일반적인 다형성 현상에 대한 개요를 제공하겠습니다.
파라 메트릭 다형성 (일명 제네릭)
Parametric polymorphism은 유형이 전혀 중요하지 않기 때문에 서로 다른 유형이 상호 교환 가능하다고 말합니다. 매개 변수 다형성 유형의 하나 이상의 매개 변수를 정의하는 함수는 해당 인수에 대해 아무것도 알지 못하지만 모든 유형에 채택 할 수 있으므로 모두 동일하게 처리해야합니다. 이러한 함수는 데이터의 일부가 아닌 인수의 속성으로 만 작동 할 수 있기 때문에 이것은 매우 제한적입니다.
const id = x => x;
id(1);
id("foo");
const k = x => y => x;
const k_ = x => y => y;
k(1) ("foo");
k_(1) ("foo");
const append = x => xs => xs.concat([x]);
append(3) ([1, 2]);
append("c") (["a", "b"]);
임시 다형성 (일명 오버로딩)
임시 다형성은 서로 다른 유형이 특정 목적에 대해서만 동등하다고 말합니다. 이러한 의미에서 동등 해지려면 유형은 해당 목적에 특정한 함수 세트를 구현해야합니다. 임시 다형성 유형의 매개 변수를 하나 이상 정의하는 함수는 각 인수에 연결된 함수 집합을 알아야합니다.
임시 다형성은 함수가 더 큰 유형의 도메인과 호환되도록합니다. 다음 예제는 "맵 오버"목적과 유형이이 제약 조건을 구현하는 방법을 보여줍니다. 함수 집합 대신 "맵핑 가능"제약 조건에는 단일 map
함수 만 포함 됩니다.
class Option {
cata(pattern, option) {
return pattern[option.constructor.name](option.x);
}
map(f, opt) {
return this.cata({Some: x => new Some(f(x)), None: () => this}, opt);
}
};
class Some extends Option {
constructor(x) {
super(x);
this.x = x;
}
};
class None extends Option {
constructor() {
super();
}
};
const map = f => t => t.map(f, t);
const sqr = x => x * x;
const xs = [1, 2, 3];
const x = new Some(5);
const y = new None();
console.log(
map(sqr) (xs)
);
console.log(
map(sqr) (x)
);
console.log(
map(sqr) (y)
);
하위 유형 다형성
다른 답변은 이미 하위 유형 다형성을 다루기 때문에 건너 뜁니다.
구조적 다형성 (일명 구조적 하위 유형 지정)
구조적 다형성은 서로 다른 유형이 동일한 방식으로 동일한 구조를 포함하면 한 유형이 다른 유형의 모든 속성을 갖지만 추가 속성을 포함 할 수 있다고 말합니다. 즉, 구조적 다형성은 컴파일 타임에 덕 타이핑이며 확실히 추가적인 타입 안전성을 제공합니다. 그러나 두 값이 일부 속성을 공유하기 때문에 동일한 유형이라고 주장함으로써 값의 의미 수준을 완전히 무시합니다.
const weight = {value: 90, foo: true};
const speed = {value: 90, foo: false, bar: [1, 2, 3]};
불행히도 speed
는의 하위 유형으로 간주 weight
되며 value
속성을 비교하자마자 사과와 오렌지를 가상으로 비교합니다.