8

나는이 모델은 SQL과 같은 쿼리 최적화 다음 typeclass :하스켈 중복 인스턴스를 입력 기능

class OptimizableQuery q where 
    type Optimized q :: * 
    optimize :: q -> Optimized q 

instance Query q => OptimizableQuery q where 
    type Optimized q = q 
    optimize q = q 

instance (Query q, OptimizableQuery q) => OptimizableQuery (Select (Select q p) p) where 
    type Optimized (Select (Select q p) p) = Select (Optimized q) p 
    optimize (Select (Select q _) p) = Select (optimize q) p 

문제가 내가 최적화 된 유형의 기능에 대한 "충돌 가족 인스턴스 선언"오류를 얻을 수 있다는 것입니다. 왜 그런데 어떻게 해결할 수 있을까요? 모든 경우를 처리해야하는 대신에 (예를 들어 꽤 많은 수의) "대체 인스턴스"를 갖는 것이 좋을 것입니다 ...

답변

7

유형이 중복되는 인스턴스는 존재하지 않습니다. 자세한 내용은 GHC manual, "동의어 인스턴스 유형 중첩"을 참조하십시오.

이유는 사용 가능한 인스턴스에 따라 유형 함수 응용 프로그램에 대해 가능한 두 가지 결과가 있으면 소리가 나지 않을 수 있기 때문입니다.

+0

어떻게 해결할 수 있습니까? –

+0

나는 모든 경우를 다 써 버리는 것과는 별개의 대안을 생각할 수 없다. 죄송합니다! –