2014-12-11 3 views
4

목록 단순화 목록, 목록 목록, 목록 목록 목록 등의 목록에 대한 기능을 작성하고 싶습니다. 나는 다음을 작성할 수'not'제약 조건 연산자가 있습니까?

NotFlattenable a
{-# LANGUAGE TypeFamilies #-} 
class Flattenable a where 
    type Flattened a 
    flatten :: a -> Flattened a 

instance NotFlattenable a => Flattenable [a] where 
    type Flattened [a] = [a] 
    flatten = id 

instance Flattenable a => Flattenable [a] where 
    type Flattened [a] = Flattened a 
    flatten = concat . map flatten 

Flattenable의 인스턴스없이 그 a에 제한 몇 가지 제약 조건입니다. NotFlattenable은 합법적 인 제약 사항입니까? 나는 그것을 어떻게 써야 할까?

답변

7

아니오 (A NotFlattenable 제약의 부재는 두 인스턴스가 오버랩 할 것이라고 주) 하스켈의 타입 클래스는 항상 열려 있기 때문에,이 수 없습니다 : 컴파일러가 누군가 때문에, 존재하지않는 일부 인스턴스를 증명할 수 없다 나중에 언제든지 추가 할 수 있습니다.

+0

짧은 답변을 드려 죄송합니다. 아직 폐쇄 형 가족 및 'OverlappingInstances'라는 속임수에 대한 언급이 필요합니다. – leftaroundabout

+1

'OverlappingInstances'는 괜찮습니다. – dfeuer

+2

닫힌 클래스'Flattenable'에 만족하면 닫힌 타입 패밀리를 사용하여 뭔가를 해킹 할 수 있습니다. – augustss

관련 문제