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에는 하위 유형이 없습니다. Option
Haskell에서라는에 해당하는 것은 다음과 Maybe
같은 정의를 갖습니다.
data Maybe a = Nothing | Just a
유형 변수 a
는 하나의 유형 만 될 수 있으므로 이에 대한 추가 정보가 필요하지 않습니다.
언급했듯이 Haskell에는 하위 유형이 없습니다. 그러나 타입 클래스를 살펴보면 서브 타이핑없이 어떻게 작동하는지 명확하지 않을 수 있습니다.
유형 클래스는 유형 자체가 아니라 유형에 대한 술어를 지정합니다. 따라서 Typeclass에 수퍼 클래스가있는 경우 (예 : Eq a => Ord a) 인스턴스가 하위 유형이라는 의미는 아닙니다. 유형 자체가 아니라 술어 만 상속되기 때문입니다.
또한 co-, contra- 및 in-variance는 수학의 다른 분야에서 다른 것을 의미합니다 (Wikipedia 참조). 예를 들어 공변 및 반 변성이라는 용어는 펑터에서 사용되지만 (하스켈에서 다시 사용됨) 용어는 완전히 다른 의미를가집니다. 불변이라는 용어는 많은 곳에서 사용될 수 있습니다.
'IT TIP' 카테고리의 다른 글
Symfony2-Doctrine : ManyToMany 관계는 데이터베이스에 저장되지 않습니다. (0) | 2020.12.30 |
---|---|
여러 조건으로 MySQL 조인 (0) | 2020.12.30 |
Linux의 최대 프로세스 수 (0) | 2020.12.30 |
sys.exit (0)과 os._exit (0)의 차이점은 무엇입니까? (0) | 2020.12.30 |
두 색상 간의 대 비율을 프로그래밍 방식으로 계산하는 방법은 무엇입니까? (0) | 2020.12.30 |