2012-02-15 4 views
52

유형의 공분산 및 반공 변성이 무엇인지 압니다. 제 질문은 왜 하스켈에 대한 저의 연구에서 (스칼라와는 대조적으로) 이러한 개념들에 대한 논의에 접하지 않았습니까?하스켈에서 (왜 스칼라 또는 C#과 반대되는) 하스켈의 공동 편차와 콘트라 편차에 대해 많은 논의가없는 이유는 무엇입니까?

하스켈이 스칼라 또는 C#과 반대되는 방식으로 근본적인 차이가있는 것 같습니다. 그 차이점을 명확히 밝힙니다.

아니면 내가 잘못 그리고 난 아직

+2

오랜 시간이 지났지 만 공동/대조 - 차이에 대한이 비디오에서 일부 기능/haskellish 대화를 기억합니다. http://channel9.msdn.com/shows/Going+Deep/E2E-Brian-Beckman-and -Erik-Meijer-Co 물리 - 및 물리 - 프로그래밍 -2 of-2/ – steamer25

답변

58

는 두 가지 이유가 있습니다 :-) 하스켈을 충분히 습득하지 않은 : 일반적으로, 그래서

  • 하스켈은 하위 유형의 고유 개념이 부족하다 분산은 덜 관련이 있습니다.
  • 변경 가능성이있는 곳에서는 반항성이 대부분 나타납니다. 따라서 하스켈의 대부분의 데이터 유형은 단순히 공변량이되며이를 명시 적으로 구분할 가치가 없습니다.

그러나, 개념을 적용 할 - 예를 들어, Functor 인스턴스 fmap 의한 승강 동작은 실제로 공변이고; 범주 개념에서 펑 터에 대해 이야기하기 위해 공동/반항이라는 용어가 사용됩니다. contravariant package은 반작용 펑터 (contravariant functor)에 대한 유형 클래스를 정의합니다. 인스턴스 목록을 보면 왜 그것이 덜 일반적이라는 것을 알 수 있습니다. 다양한 숫자 형 클래스와 IntegerRational 같은 기본 유형에서 변환을 정의하고, 모듈 Data.List는 일부 표준 기능의 제네릭 버전을 포함 -

또한 아이디어의 작동 방식을 수동 전환으로, 암시 적으로 나타 곳이 있습니다 . the types of these generic versions을 보면 제약 조건 (toInteger)이 반공 위치 유형에 사용되고 Num 제약 조건 (fromInteger)이 공분산 위치에 사용되는 것을 볼 수 있습니다.

+7

반 차별과 가변성 사이에는 아무런 관련이 없습니다. 사실, 변경 가능성은 불변성을 초래합니다. 반공 변성의 예는 함수 입력, 'Ord'와'Eq' (물론 그 등가물)입니다. 어느 것도 변이 될 데이터가 없습니다. –

+13

@ DanielC.Sobral : 변경 가능한 참조에 쓰는 것은 반의어이며 함수 입력의 특수한 경우입니다. 따라서 단순한 데이터 유형은 종종 공분산을 허용하지만, 반공 진성을 허용하는 유형은 싱크 또는 출력을 나타내는 경향이 있습니다. 일종의 부작용이 발생하지 않는 한 사소한 것일 수 있습니다. 읽기 및 쓰기 작업이 포함 된 변경 가능한 참조는 반드시 불변합니다. –

+0

@Daniel mutability와 관련된 Contravariance는 [with with function] (http://hackage.haskell.org/packages/archive/snap/0.7/doc/html/Snap-Snaplet.html#v:with)에서 볼 수 있습니다. 스냅 프레임 워크의 Snaplet API. "가변적"상태의 계층 구조를 쉽게 조작 할 수 있도록 설계되었습니다. – mightybyte

21

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

스칼라에서 예를 들어, 서브 클래스가 Some[+A]NoneOption[+A]입니다. 공분산 주석 +을 제공해야 Option[Foo]Option[Bar] 인 경우 Foo extends Bar 일 수 있습니다. 하위 유형이 있기 때문에 이것이 필요합니다.

하스켈에는 하위 유형이 없습니다. Maybe라는 하스켈 Option의 동등한,이 정의가 있습니다

data Maybe a = Nothing | Just a 

유형 a 변수 오직 한 종류, 그래서 그것에 대해 더 정보가 필요하지 않습니다 수 있습니다.

6

앞서 언급했듯이 하스켈에는 하위 유형이 없습니다. 그러나, 당신이 typeclasses를보고 있다면 그것이 subtyping없이 어떻게 작동하는지 명확하지 않을 수 있습니다.

유형 기둥은 유형 자체에 대한 술어를 지정합니다. 그래서 타입 클래스가 수퍼 클래스 (예 : Eq a => Ord a)를 가질 때, 그것은 술어 만이 상속되고 타입 자체는 상속받지 않기 때문에 인스턴스가 서브 타입이라는 것을 의미하지는 않습니다.

또한, 공동, 반대 및 분산은 다른 분야의 수학에서 서로 다른 것을 의미합니다 (위키 백과 참조). 예를 들어, 공변량 (covariant)과 반동 적 (contravariant)이라는 용어는 펑터 (functor) (다시 하스켈에서 사용됨)에서 사용되지만 용어는 전혀 다른 것을 의미합니다. 용어 불변성은 많은 장소에서 사용될 수 있습니다.