accelerate 라이브러리에서 가져 오는 모듈에 (Data.Tagged) 유형의 show
을 보내려고합니다. 불행히도 가속 라이브러리는 Data.Array.Accelerate.Pretty.hs에서 쇼 인스턴스를외부 라이브러리의 중복 인스턴스 해결
instance Kit acc => Show (acc aenv a) where
으로 정의합니다. 조금 주위를 읽으면이 인스턴스를 가져 오는 것을 피하기 위해 할 수있는 일은 없으며 분명히 Data.Tagged 인스턴스와 겹칩니다. Show
인스턴스. 사실 제네릭 가속 인스턴스를 사용하면 종류가 *->*->*
인 것을 인쇄 할 수 없습니다. 여기
{-# LANGUAGE FlexibleContexts, OverlappingInstances, IncoherentInstances #-}
import Data.Array.Accelerate
import Data.Tagged
main :: (Show (Tagged Int Int)) => IO()
main = let x = Tagged 3
in print (x::Tagged Int Int)
오류 : 나는 OverlappingInstances
나를 해결할 수 있도록 것이라고 생각
- :
내가 몇 가지 질문이 인스턴스,하지만 같은 오류가 발생합니다.Overlapping instances for Show (Tagged * Int Int) arising from a use of `print' Matching instances: instance Show b => Show (Tagged k s b) -- Defined in `Data.Tagged' instance [overlap ok] accelerate-0.13.0.5:Data.Array.Accelerate.Trafo.Base.Kit acc => Show (acc aenv a) -- Defined in `Data.Array.Accelerate.Pretty'
IncoherentInstances
분명히 나를 컴파일하게하십시오 ... 맞습니까? 그러나 그렇지 않습니다. 나는 내가 단지 수 어디에 전에 본 생각instance Show b => Show (Tagged s b) where
: (Data.Tagged에서 복사) 인스턴스가있는 경우
왜 GHC 보고서는 Data.Tagged는 Show (Tagged k s b)
로 인스턴스를 보여 않습니다 GHC에서 가장 구체적인 인스턴스를 선택하도록 명시 적으로 형식 시그니처를 추가하여 겹치는 인스턴스를 해결하지만 내 예제가 최상위 수준에 있고 다형성을 포함하지 않기 때문에 필자는 유형.
내가 생각하기에 GHC가 Tagged
이 Accelerate.Base.Kit
의 인스턴스가 아니기 때문에 GHC가 Data.Tagged 인스턴스를 선택할 수 있어야한다는 것입니다. 따라서 인스턴스 제약 조건을 충족하지 못합니다. 인스턴스는하지만, GHC는
내가 버그 리포트 here을 만들어
편집하고 잘못된 인스턴스) ... 하나의 인스턴스가 가능하게 적용 할 수 없다는 것을 알아낼 수 있어야 지금 제거 레포 머리에. 아래 # 3에 대한 훌륭한 대답이 있습니다.하지만 여전히 OverlappingInstances
/IncoherentInstances
이 작동하지 않는 이유를 알고 싶습니다. 유형이 -XPolyKinds
컴파일 할 때