2016-09-22 2 views
0

아래 그림은 데이터 유형 인스턴스를 사용하는 예 (지루하게 간단한 것)입니까? 즉, 서로 다른 데이터에 대해 서로 다른 동작을 정의 할 수 있습니다.데이터 유형 인스턴스?

그렇지 않은 경우 어떻게 사용할 수 있습니까?

코드 : 그들이 어떤 차이가 없기 때문에

data HealthIndicators = Weight | Age | BloodPressure deriving (Show) 
data IrrelevantIndicators = Starsign | BirthMonth | IQ deriving (Show) 

class IndicatorTest a where 
    indicatortest :: a -> Bool 

instance IndicatorTest HealthIndicators where 
    indicatortest Weight = True 
    indicatortest Age = True 
    indicatortest BloodPressure = True 

instance IndicatorTest IrrelevantIndicators where 
    indicatortest Starsign = False 
    indicatortest BirthMonth = False 
    indicatortest IQ = False 
+0

형식 안전 (평등) (https://hackage.haskell.org/package/base-4.9.0.0/docs/Prelude.html#t:Eq), 주문 등을 쉽게 정의 할 수 있습니다. 타입 클래스가 더 높은 종류의 유형 (예 : [monads] ​​(https://hackage.haskell.org/package/base-4.9.0.0/docs/Prelude.html#t)과 유사 할 수 있다는 사실을 알지 못합니다. : 모나드) 또는 화살표) – Alec

+0

글쎄, 그건 사실이지만 일반적으로 두 가지 다른 기능을 사용합니다. 또는 다른 모듈에 두 개의 동일한 이름 함수를 정의하십시오. 대다수의 경우, 우리는 OOP처럼 동적 인 디스패치가 필요하지 않습니다. 여전히 귀하의 예는 기술적으로 정확하지만 예를 들어 'Ord, Eq, Show, Monoid, ... '는 훨씬 더 흥미롭고 일반적입니다. 너는 그들을 보길 원할지도 모른다. – chi

+0

예, 한 가지 가능한 목표는 다른 데이터 유형에 대한 공통적 인 용도를 찾는 것입니다. 이것은 데이터 유형의 원래 작성자가 상상조차하지 않았던 것을 사용하는 것일 수도 있습니다. 즉,이 예제가 멋진 데이터 모델을 구성한다고 확신하지는 않습니다. – Ingo

답변

0

먼저, 인스턴스는 모든 경우를 나열 할 필요가 없습니다. 당신은

instance IndicatorTest HealthIndicators where 
    indicatortest _ = True 

을 쓸 수 있습니다 또는 당신이 선호하는 경우, 두 번째 줄은

indicatortest = const True 

이 같은 기능을 작성하는 경우이 유용 할 수 있습니다 될 수 있습니다

foo :: (IndicatorTest h) => h -> String 

을 당신이 필요 결과는 h 유형이 유용한 표시기인지 여부에 따라 달라집니다. 그러나이 경우 어쨌든 IndicatorTest 클래스에서 "foo"함수를 만들었을 것입니다.

실제 달성하려는 내용을 알지 못하면 더 이상 조언하기가 어렵습니다.

관련 문제