2013-04-12 14 views
15

내가 의존적 형식의 프로그램에 신문을 읽고 다음과 같은 인용 건너 온 오전 :확장 하스켈 타입 클래스

"[...] 하스켈의 타입 클래스와 달리, 데이터 유형이 [...]입니다 닫음 "과 같이 데이터 형식을 확장하지 않고 유니버스에 새 형식을 추가 할 수 없다는 의미에서 사용됩니다.

내 초보자 질문은 어떤 의미에서 하스켈 유형 수업 열기입니까? 그것들은 어떻게 확장 가능합니까? 또한,이 속성 (열린 대 닫힌 상태)의 유형 이론적 결과는 무엇입니까?

감사합니다.

답변

9

... 사전에 번역 된 번역본 :

listIsAMonoid :: Monoid [a] 
listIsAMonoid = Monoid 
    { mempty = [] 
    , mappend = (++) 
    } 

... 그리고 용량을 가진 목록을 Monoid으로 사용할 때마다 컴파일러는 위의 사전을 참조합니다. 질문에 대한

이것은 우리 제공 : 어떤 의미에서

하스켈 타입 클래스는 열려있다? 그것들은 어떻게 확장 가능합니까?

다형성 값이 열리는 것과 같은 의미로 열립니다. 우리는 몇 가지 다형성 데이터 유형이 있습니다

data Monoid m = ... 

을 ... 그리고 우리는 우리가 memptymappend 필드에 적절한 값을 제공 할 수있는 모든 유형의 다형성 m 유형 변수를 인스턴스화 할 수 있습니다.

+0

type-class-as-dictionary 해석은 다소 ghc 특정 적이다. haskell 스펙에는 요구 사항이 없으며 다른 구현 (예 : jhc)에서는 다른 접근 방식을 사용합니다. –

+0

@ JohnL 그것은 다형 적 감각을 이해하는 데 여전히 유용한 정신 도구입니다. –

12

임의의 유형을 인스턴스로 만들 수 있기 때문에 유형 클래스가 열려 있습니다. 유형 클래스를 작성할 때 인터페이스를 지정하지만이 유형에 속하지는 않습니다. 그런 다음 typeclass 정의를 포함하는 모든 코드에서 instance TypeClass type of 구문을 사용하여 인터페이스에서 필요한 기능을 제공하는 유형 인스턴스를 만들 수 있습니다.

+1

답변 해 주셔서 감사합니다. 이전에 인터페이스/구현 직관력이있었습니다. 내 질문은 나중에 유형 클래스에 의해 주어진 인터페이스를 나중에 확장 할 수 있는지, 즉 초기 범위 외부에서 해당 데이터 유형에 대해 다른 생성자를 정의하는지 여부에 관한 것이 었습니다. – AnaK

+0

새로운 유형 클래스 만 정의하여 인터페이스를 확장 할 수 있지만 확장 할 수있는 상속 개념이 있습니다. 'class (Interface BetterInterface) => BetterInterface type where ...'를 사용할 수 있습니다. 'Monad '가'Functor'의 확장으로 어떻게 구현 될 수 있는지 비교해보십시오. – Adrian

+0

알겠습니다. 나는 ** 열린 ** 데이터 타입의 라인을 따라 더 많은 생각을하고 있었는데, 생성자가 흩어져 보일 수도 있고, 의미 론적으로 닫힌 것처럼 (한 곳에서 정의 된 것처럼) 나타낼 수도 있습니다. – AnaK

2

랄프 라 멜멜 (Ralf Laemmel)은 이것에 대해 매우 좋은 video lectures on Channel9을 가지고 있습니다. 적극 권장합니다.

data Monoid m = Monoid 
    { mempty :: m 
    , mappend :: m -> m -> m 
    } 

인스턴스와 같은 :

instance Monoid [a] where 
    mempty = [] 
    mappend = (++) 

class Monoid m where 
    mempty :: m 
    mappend :: m -> m -> m 

... 그것이 (기본적으로) 사전 형식으로 후드를 구현 : 같은 종류의 클래스 감안할 때

+0

참조 해 주셔서 감사합니다. 나는 표현의 문제를 알지 못했다. – AnaK

3

유형 클래스는 더 많은 인스턴스 선언을 추가하여 "사실 이후"유형을 항상 추가 할 수 있기 때문에 "공개"입니다. 심지어 이 유형 클래스를 포함하는 모듈을 사용하는 "클라이언트"코드로 수행 될 수도 있습니다.

요점은 일부 유형 클래스 제약 조건이있는 값에 대해 작동하는 코드를 작성할 수 있으며 수정하지 않은 동일한 코드를 유형 클래스를 작성할 때 존재하지 않는 유형에 사용할 수 있다는 것입니다.

하스켈의 구체적인 데이터 유형은 발생하지 않을 수 있다는 점에서 "닫힙니다". 멤버에 대해 특정 데이터 유형 (다형성이라 할지라도)을 조작하는 코드를 작성하면 유형을 수정할 수 없다면 생각지 못했던 새로운 종류의 코드를 사용할 수있는 방법이 없습니다. (아마도 사용 된 모든 장소를 수정해야 할 것입니다).