2011-02-16 7 views
13

나는 the documentation for -XUndecidableInstances을 알고 있지만, 나는 정교함을 요구할 것이라고 생각했습니다.UndecidableInstances는 언제 안전한가요? GHC 확장에 관한 몇 가지 일반적인 질문

내가 (-XMultiParamTypeClasses로 허용)이 다중 매개 변수 typeclasses 이제

class Foo a b 
class Goo a b 

이 있다고 가정, 나는 매개 변수화 된 데이터 유형 내가 Foo 때의 인스턴스를 만들고 싶어

data Bar a b 

이 있다고 가정 매개 변수 중 하나는 Goo의 인스턴스의 일부입니다. 그래서 여기에 내가 쓰고 싶은거야, 이전 문장이 정확한 용어를 사용 확실하지 않다 :

instance (Goo c d) => Foo d (Bar a d) 

는 I는 UndecidableInstances 확장자없이 허용하고 있지 않다. 인스턴스가 c 유형을 참조하지 않기 때문에 이것이 올바른지 생각해보십시오.

나는 ...

  1. 그냥 확장을 가능하게 하는가? 누군가 나를 괴롭히는 문제를 정교하게 처리 할 수 ​​있습니까?
  2. Foo에 다른 매개 변수를 추가하여 마지막 인스턴스 선언이 Foo c d (Bar a d)과 같아 지도록합니까? 문제는 "제 4 유형 매개 변수"를 전혀 참조하지 않는 다른 인스턴스 (Foo)가있을 수 있습니다. 즉, 내 코드와 관련이없는 부분에 instance Foo A B 형태의 인스턴스가 있기 때문에 깨질 수 있습니다. 오히려 내 수업이 아니라 내 문제를 고칠 수 있습니다.
  3. 매개 변수가 충분한 새 클래스 FooGoo을 만드시겠습니까? 나는이 경우 자신을 반복하고있는 것처럼 느낄 것입니다. 그러나 적어도 관련이없는 수업은 중단하지 않을 것입니다.

누구나 지혜가 있습니까?

답변

10

인스턴스가 C 유형을 나타내지 않았기 때문에 이것이 올바른지 생각해보십시오.

예, 코드 (here에서)을 준수하지 않습니다

을 맥락에서 각 주장의 경우 : 없음 형 변수가 머리보다 의 주장을 더 발생이 없습니다

일반적으로 루프를 형성하는 다른 인스턴스를 추가하지 않으면 안전해야합니다. 상황은 OverlappingInstances 일 때만 실제로 털이 많고 (컴파일러에 따라 달라질 수 있습니다.) IncoherentInstances으로 갈 때 악의적 인 경우가 있습니다.

당신이 달성하고자하는 것에 대해 더 많이 알지 못하면 건전한 디자인 조언을하기가 어렵지만, 가장 먼저 확인해야 할 것은 Goo에 매개 변수로 c가 필요한지 여부입니다. 다음과 같이 원하는 것을 표현할 수 있습니다.

class Goo d where 
    bar :: d c -> Int 
    baz :: Quux c => d c -> Int 
+0

감사합니다. 이것은 약간의 설명을 가져옵니다. – gspr

+0

+1은 'IncoherentInstances'를 악으로 설명합니다. –

+2

'Goo''가 함수 적 종속성'd -> c'를 가지지 않는 한'Goo cd' 제약 조건으로'Foo d (Bar ad)'인스턴스를 사용할 수 없게 될 것입니다. 그렇지 않으면 컴파일러가'Goo' 인스턴스 사용? 모든'Goo' 인스턴스가'd'에없는 타입 변수로'c'를 가지고 있다면, @ barsoap의 제안은 그 타입 파라미터를 떨어 뜨리는 방법입니다. – mokus

관련 문제