2016-11-19 13 views
1

this 질문에서 태그가 지정되지 않은 공용체는 하위 유형 지정의 한 형태로 설명됩니다.태그가 지정되지 않은 공용체가 유형 클래스를 허용하는 것과 동등한 것을 허용합니까?

유형 클래스도 하위 유형 지정의 양식입니다.

개념적으로 동일합니까? 저도 그렇습니다. 하스켈에서 어떻게 구현합니까?

+4

하스켈은 모든 값이 정확히 _one_ 타입이기 때문에 전통적으로 정의 된 바와 같이 하스켈에는 하위 유형 지정이 없다고 주장합니다. Typeclasses는 유형 정의 언어를 확장하여 사용자 정의 다형성을 허용하는 단순한 방법입니다. 즉,'x' 값은'C a => a' 타입을 가지며,'C'는'a' 규칙을 준수해야합니다. 그러나 여전히'x'는 정확하게 하나의 타입을 가지고 있습니다. 'x' 값이 여러 유형, 즉 기본 유형 및 기본 유형에서 서브 클래스 인 모든 유형이있는 OOPy 부속 유형 지정과 대조하십시오. – hao

+1

또 다른, 좀 더 근심스러운 주장 : 서브 타입 화는 Haskell 컴파일러가 가지고있는 DHM 스타일의 주요 유형 유추를 금지하는 반면, typeclasses는 그렇지 않습니다. – hao

+3

@ haoformayor의 요점을 상세히 설명하십시오 : 하위 유형 지정과 임시 비정상을 혼동하지 마십시오. 서브 타이핑은 임의 (Ad-hoc) 다형성의 한 가지 특징이며 유형 클래스는 다소 다른 것입니다. –

답변

4

유형 클래스도 하위 유형 지정의 한 형태입니다.

아니요. 그림을 위해 들어, 내가 그 질문에 언급 TypeScript examples로 돌아가 보자

우리는 노동 조합 유형이 값이 있다면, 우리가 할 수있는 노동 조합의 모든 유형에 공통되는 전용 액세스 회원 .

interface Bird { 
    fly(); 
    layEggs(); 
} 

interface Fish { 
    swim(); 
    layEggs(); 
} 

function getSmallPet(): Fish | Bird { 
    // ... 
} 

let pet = getSmallPet(); 
pet.layEggs(); // okay 
pet.swim(); // errors 

여기, getSmallPet의 반환 형식은 FishBird하지만 FishBird 모두 회원 일반 회원으로 가지고 그 둘의 슈퍼 아닙니다. Fish이고Fish | Bird이며, 따라서 Bird입니다. 타입 클래스와 어떻게됩니까

는 매우 다르다 :

foo :: Num a => a -> a 
foo x = (x * x) + x 

동안 (3 :: Integer)(7.7 :: Double)도 가지고 Num에 해당하는 슈퍼가 의미하지 않는다 모두 foo (3 :: Integer)foo (7.7 :: Double) 작품. 대신 Num a => a -> a에 따르면 a을 선택하면 Num의 인스턴스가 있어야하며 Num은 유형이 아니므로 해당 유형의 (*)(+)의 적절한 구현이 있도록 강조해야합니다. OOP 메소드와 달리 (*)(+)은 특정 유형에 속하지 않으므로 IntegerDouble과 함께 사용하려면 상위 유형을 도입 할 필요가 없습니다.

+0

이 답변은 많은 도움이됩니다. 감사합니다. 그럼에도 불구하고 나는'Pet' 예제가 타입 클래스를 통해 구현 될 수 있기 때문에 두 개념이 적어도 관련되어 있다는 느낌을 가지고있다. 질문 : "형식 클래스 제약 조건은 태그가없는 노동 조합만큼 강력합니까?" (이것은 아마도 후속 질문으로 더 적합 할지라도). – ThreeFx

+3

@ThreeFx 우리는이 경우 동일한 목표를 달성하는 두 가지 매우 다른 방법이라고 말할 수 있습니다.그런데 TypeScript 예제에서 '물고기'와 '새'가 확장되는'layEggs' 메소드를 가진'Oviparous' 인터페이스가 있다면, 태그없는 부분은 토론에 필수적이지 않다는 점은 주목할 가치가 있습니다 근본적인 차이점은 동일하게 유지됩니다. 관련있는, 다소 접선 인 질문 : [* 파라 메트릭 다형성 대 Ad-hoc 다형성 *] (http://stackoverflow.com/q/6730126/2751851). – duplode