IT TIP

Haskell의 공분산 및 반 분산에 대한 논의가 많지 않은 이유는 무엇입니까 (Scala 또는 C #과 반대)?

itqueen 2020. 12. 30. 19:58
반응형

Haskell의 공분산 및 반 분산에 대한 논의가 많지 않은 이유는 무엇입니까 (Scala 또는 C #과 반대)?


유형의 공분산과 반공 분산이 무엇인지 압니다. 내 질문은 왜 Haskell에 대한 내 연구에서 이러한 개념에 대한 논의를 접하지 않은 이유입니다 (예를 들어 Scala와 반대)?

Haskell이 Scala 또는 C #과는 반대로 유형을 보는 방식에 근본적인 차이가있는 것 같습니다. 그리고 그 차이가 무엇인지 명확히하고 싶습니다.

아니면 내가 틀렸고 아직 하스켈을 충분히 배우지 못했을 수도 있습니다 :-)


두 가지 주요 이유가 있습니다.

  • Haskell은 하위 유형에 대한 고유 한 개념이 없기 때문에 일반적으로 분산은 관련성이 낮습니다.
  • Contravariance는 대부분 가변성이 관련된 곳에서 나타납니다. 그래서 Haskell의 대부분의 데이터 유형은 단순히 공변 일 것이며 명시 적으로 구별 할 가치가 거의 없습니다.

그러나 개념이 적용 않습니다 - 예를 들어, 리프팅 작업을 수행 fmap하기위한 Functor인스턴스 실제로 공변입니다; 용어 co- / contravariance는 펑터에 대해 이야기하기 위해 범주 이론에서 사용됩니다. contravariant패키지는 contravariant 펑의 유형 클래스를 정의하고, 인스턴스 목록을 보면 내가 훨씬 덜 흔한 말했다 당신은 왜 볼 수 있습니다.

장소는 어떻게 수동 변환 작업에 여기서 아이디어 쇼까지 암시도 있습니다 - 다양한 숫자 유형 클래스와 같은 기본 유형에서 변환을 정의 Integer하고 Rational, 모듈은 Data.List일부 표준 기능의 일반 버전이 포함되어 있습니다. 당신이 보면 이러한 제네릭의 종류 는 것을 볼 수 있습니다 Integral(제공 제약 toInteger동안) contravariant 위치 유형에 사용됩니다 Num(제공 제약 fromInteger) 공변 위치에 사용됩니다.


Haskell에는 "하위 유형"이 없으므로 공분산과 반공 분산은 의미가 없습니다.

Scala에서는 예 Option[+A]를 들어 하위 클래스 Some[+A]None. +an Option[Foo]Option[Bar]if 라고 말 하려면 공분산 주석을 제공해야 합니다 Foo extends Bar. 하위 유형이 있기 때문에 이것이 필요합니다.

Haskell에는 하위 유형이 없습니다. OptionHaskell에서라는에 해당하는 것은 다음과 Maybe같은 정의를 갖습니다.

data Maybe a = Nothing | Just a

유형 변수 a는 하나의 유형 만 될 수 있으므로 이에 대한 추가 정보가 필요하지 않습니다.


언급했듯이 Haskell에는 하위 유형이 없습니다. 그러나 타입 클래스를 살펴보면 서브 타이핑없이 어떻게 작동하는지 명확하지 않을 수 있습니다.

유형 클래스는 유형 자체가 아니라 유형에 대한 술어를 지정합니다. 따라서 Typeclass에 수퍼 클래스가있는 경우 (예 : Eq a => Ord a) 인스턴스가 하위 유형이라는 의미는 아닙니다. 유형 자체가 아니라 술어 만 상속되기 때문입니다.

또한 co-, contra- 및 in-variance는 수학의 다른 분야에서 다른 것을 의미합니다 (Wikipedia 참조). 예를 들어 공변 및 반 변성이라는 용어는 펑터에서 사용되지만 (하스켈에서 다시 사용됨) 용어는 완전히 다른 의미를가집니다. 불변이라는 용어는 많은 곳에서 사용될 수 있습니다.

참조 URL : https://stackoverflow.com/questions/9302739/why-arent-there-many-discussions-about-co-and-contra-variance-in-haskell-as-o

반응형