수색…


기본 사용법

GADTs 확장을 사용하면 일반 데이터 선언 외에 다음과 같이 일반화 된 대수 데이터 형식을 선언 할 수도 있습니다.

data DataType a where
    Constr1 :: Int -> a -> Foo a -> DataType a
    Constr2 :: Show a => a -> DataType a
    Constr3 :: DataType Int

GADT 선언은 데이터 유형에 포함 된 모든 생성자의 유형을 명시 적으로 나열합니다. 일반 데이터 유형 선언과 달리 생성자의 유형은 궁극적으로 데이터 형식이 일부 인수에 적용되는 결과를 가져 오는 N-ary (nullary 포함) 함수가 될 수 있습니다.

이 경우 DataType 유형에는 Constr1 , Constr2Constr3 세 가지 생성자가 있다고 선언했습니다.

Constr1 생성자는 일반 데이터 선언을 사용하여 선언 된 구문과 다르지 않습니다. data DataType a = Constr1 Int a (Foo a) | ...

그러나 Constr2 에는 aShow 인스턴스가 있어야하며, 생성자를 사용할 때는 인스턴스가 필요합니다. 반면에 패턴 매칭을 할 때, aShow 의 인스턴스라는 사실은 범위에 포함되므로 다음과 같이 작성할 수 있습니다.

foo :: DataType a -> String
foo val = case val of
    Constr2 x -> show x
    ...

점을 유의 Show a 제약 함수의 형태로 표시하고, 오른쪽의 코드에서만 볼 수 없습니다 -> .

Constr3 입력 보유 DataType Int 타입의 값마다 즉, DataType a A는 Constr3 ,이 알려져있다 a ~ Int . 이 정보 역시 패턴 일치로 복구 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow