유형동구

8383 단어 functionalscala
type algebra에서 두 가지 유형이 서로 바꿀 수 있고 정보를 잃어버리지 않을 때 유형동구가 바로 이런 상황이다.
이는 A을 주조하거나 B으로 바꾸어 같은 a: A으로 되돌릴 수 있고 B을 주조하거나 a으로 바꾸어 같은 b: B으로 되돌릴 수 있다면 두 종류는 Ab이 서로 구성된다는 것을 의미한다.
예를 들면 다음과 같습니다.
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
YesNoBoolean으로 변환하고 돌아오면 아무런 정보도 손실되지 않습니다.

일치성
두 가지 유형이 동구인지 아닌지를 판단하는 방법은 그들의 산술을 통해 산술이 같으면 유형이 동구이다.
간단하게 말하면, 유형의arity는 가능한 값의 수량이다.하나의 유형을 하나의 집합으로 간주합니다.arity는 원소의 수량입니다.
다음은 몇 가지 주요 예이다.
  • Nothing: arity 0(가능한 인스턴스 없음)
  • Unit: arity 1(() 값만 해당)
  • Boolean: arity는 2(truefalse)
  • Int: arity는 429467296(2바이트, 4바이트)
  • 따라서 AB이 같은 산술수를 가지고 있다면 A의 각 값을 B의 하나에 비추고 반대로도 마찬가지다.

    대수 데이터 형식
    ADT(ADT – abstract data type과 혼동하지 마라)은 복합 연산의 시각에서 복합 유형으로 그들의 산술은 간단한 산술 규칙을 따른다.
    분석 유형 - 복합 값이 유일하게 선택할 수 있는 경우, 즉, 하나 또는 다른 하나의arity는 복합 유형의 총체와 같다.
    예를 들어 YesNo 유형은 Yes.typeNo.type의 분석으로 YesNo의 실례는 Yes(Yes.type의 실례) 또는 No(No.type의 실례)이 될 수 있음을 의미한다.
  • Yes.type
  • arity 1
  • No.type
  • YesNo ≡ Yes.type + No.type
  • YesNo의 산술은 1+1=2
  • 주의: Dotty (Scala 3)은 유형 분석에 아주 좋은 syntax이 있는데 Haskell과 유사하다.
    합성 유형 - 복합 값이 동반 값일 때, 즉, 하나와 다른 산술은 복합 유형의 곱셈과 같다.
    예를 들어, 원조 (Boolean, Int)의 경우
  • Boolean Arity2
  • Int의 arity는 429497296
  • (Boolean, Int) ≡ Boolean * Int
  • (Boolean, Int)의 산술수는 2×429497296=858934592104667911810
    lambda 타입의arity는 타입의arity를 되돌려주고 매개 변수 타입의 幂次方으로 향상됩니다. 여러 개의 매개 변수는 하나의 연결 타입과 같습니다.
  • Boolean => Int의 면적은 429467296²
  • Int => Boolean 및 arity 2⁴²⁹⁴⁹⁶⁷²⁹⁶
  • 너는 왜 this을 읽었는지 이해할 수 있다.

    교환
    교환 가능한 유형은 a+b=b+aab=ba이기 때문에 동일합니다.
    그래서 A|BB|A과 동구, (A,B)(B,A)과 동구이다.swap 함수 자체보다 더 까다로운 것은 없다는 것을 증명한다. 데이터를 잃어버리지 않고 값을 교환할 수 있다면 유형은 동일하게 구성된다.
    def swap[A, B](v: (A, B)): (B, A) = (v._2, v._1)
    

    호기심: C 언어의 동구
    C는 메모리에 대한 접근 수준이 비교적 낮고(지침을 통해) 약한 유형이기 때문이다.메모리 길이가 같으면 가장 다른 두 종류 사이를 강제로 변환할 수 있다.
    예를 들어 C 언어에서 intfloat은 같은 구조이다.
    흥미로운 코드는 빠른 역제곱근 형식의 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;
    }
    
    이 예에서 longfloat은 동구적이지 않다. 왜냐하면 그들은 서로 다른 산술 연산을 가지고 있기 때문이다. 그러나 데이터가 어떻게 쉽게 바뀌는지 보여주고 동구를 추진했다.
    원고는 Kodumaro이다.

    좋은 웹페이지 즐겨찾기