유형동구
8383 단어 functionalscala
이는
A
을 주조하거나 B
으로 바꾸어 같은 a: A
으로 되돌릴 수 있고 B
을 주조하거나 a
으로 바꾸어 같은 b: B
으로 되돌릴 수 있다면 두 종류는 A
과 b
이 서로 구성된다는 것을 의미한다.예를 들면 다음과 같습니다.
sealed trait YesNo
object Yes extends YesNo
object No extends YesNo
YesNo
유형은 Boolean
과 동일합니다.implicit def yesno2bool(value: YesNo): Boolean = value == Yes
implicit def bool2yesno(value: Boolean): YesNo = if (value) Yes else No
YesNo
을 Boolean
으로 변환하고 돌아오면 아무런 정보도 손실되지 않습니다.일치성
두 가지 유형이 동구인지 아닌지를 판단하는 방법은 그들의 산술을 통해 산술이 같으면 유형이 동구이다.
간단하게 말하면, 유형의arity는 가능한 값의 수량이다.하나의 유형을 하나의 집합으로 간주합니다.arity는 원소의 수량입니다.
다음은 몇 가지 주요 예이다.
Nothing
: arity 0(가능한 인스턴스 없음) Unit
: arity 1(()
값만 해당) Boolean
: arity는 2(true
과 false
) Int
: arity는 429467296(2바이트, 4바이트) A
과 B
이 같은 산술수를 가지고 있다면 A
의 각 값을 B
의 하나에 비추고 반대로도 마찬가지다.대수 데이터 형식
ADT(ADT – abstract data type과 혼동하지 마라)은 복합 연산의 시각에서 복합 유형으로 그들의 산술은 간단한 산술 규칙을 따른다.
분석 유형 - 복합 값이 유일하게 선택할 수 있는 경우, 즉, 하나 또는 다른 하나의arity는 복합 유형의 총체와 같다.
예를 들어
YesNo
유형은 Yes.type
과 No.type
의 분석으로 YesNo
의 실례는 Yes
(Yes.type
의 실례) 또는 No
(No.type
의 실례)이 될 수 있음을 의미한다.Yes.type
및 No.type
YesNo ≡ Yes.type + No.type
YesNo
의 산술은 1+1=2 합성 유형 - 복합 값이 동반 값일 때, 즉, 하나와 다른 산술은 복합 유형의 곱셈과 같다.
예를 들어, 원조
(Boolean, Int)
의 경우Boolean
Arity2Int
의 arity는 429497296(Boolean, Int) ≡ Boolean * Int
(Boolean, Int)
의 산술수는 2×429497296=858934592104667911810lambda 타입의arity는 타입의arity를 되돌려주고 매개 변수 타입의 幂次方으로 향상됩니다. 여러 개의 매개 변수는 하나의 연결 타입과 같습니다.
Boolean => Int
의 면적은 429467296² Int => Boolean
및 arity 2⁴²⁹⁴⁹⁶⁷²⁹⁶ 교환
교환 가능한 유형은
a+b=b+a
과 ab=ba
이기 때문에 동일합니다.그래서
A|B
은 B|A
과 동구, (A,B)
은 (B,A)
과 동구이다.swap
함수 자체보다 더 까다로운 것은 없다는 것을 증명한다. 데이터를 잃어버리지 않고 값을 교환할 수 있다면 유형은 동일하게 구성된다.def swap[A, B](v: (A, B)): (B, A) = (v._2, v._1)
호기심: C 언어의 동구
C는 메모리에 대한 접근 수준이 비교적 낮고(지침을 통해) 약한 유형이기 때문이다.메모리 길이가 같으면 가장 다른 두 종류 사이를 강제로 변환할 수 있다.
예를 들어 C 언어에서
int
과 float
은 같은 구조이다.흥미로운 코드는 빠른 역제곱근 형식의 Quake III Arena(
Q_rsqrt
)로 바늘을 사용하여 몇 가지 유형의 흑마법을 시전한다.float Q_rsqrt(float number) {
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = *(long *) &y;
i = 0x5f3759df - (i >> 1);
y = *(float *) &i;
y = y * (threehalfs - (x2 * y * y));
return y;
}
이 예에서 long
과 float
은 동구적이지 않다. 왜냐하면 그들은 서로 다른 산술 연산을 가지고 있기 때문이다. 그러나 데이터가 어떻게 쉽게 바뀌는지 보여주고 동구를 추진했다.원고는 Kodumaro이다.
Reference
이 문제에 관하여(유형동구), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cacilhas/type-isomorphism-3bp9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)