8

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 나를 해결할 수 있도록 것이라고 생각

  1. :
    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' 
    

    내가 몇 가지 질문이 인스턴스,하지만 같은 오류가 발생합니다.
  2. IncoherentInstances분명히 나를 컴파일하게하십시오 ... 맞습니까? 그러나 그렇지 않습니다. 나는 내가 단지 수 어디에 전에 본 생각

    instance Show b => Show (Tagged s b) where 
    

: (Data.Tagged에서 복사) 인스턴스가있는 경우

  • 왜 GHC 보고서는 Data.Tagged는 Show (Tagged k s b) 로 인스턴스를 보여 않습니다 GHC에서 가장 구체적인 인스턴스를 선택하도록 명시 적으로 형식 시그니처를 추가하여 겹치는 인스턴스를 해결하지만 내 예제가 최상위 수준에 있고 다형성을 포함하지 않기 때문에 필자는 유형.

    내가 생각하기에 GHC가 TaggedAccelerate.Base.Kit의 인스턴스가 아니기 때문에 GHC가 Data.Tagged 인스턴스를 선택할 수 있어야한다는 것입니다. 따라서 인스턴스 제약 조건을 충족하지 못합니다. 인스턴스는하지만, GHC는

    내가 버그 리포트 here을 만들어

    편집하고 잘못된 인스턴스) ... 하나의 인스턴스가 가능하게 적용 할 수 없다는 것을 알아낼 수 있어야 지금 제거 레포 머리에. 아래 # 3에 대한 훌륭한 대답이 있습니다.하지만 여전히 OverlappingInstances/IncoherentInstances이 작동하지 않는 이유를 알고 싶습니다. 유형이 -XPolyKinds 컴파일 할 때

  • 답변

    5

    나는 단지 3

    에 대한 답을 알고 형태 변수의 종류에 대한 제한은 GHC는 아주 나쁘게 유형을 인쇄합니다. 형식 이름 다음에 모든 다형성 형식 변수의 종류 목록을 인쇄 한 다음 형식 변수를 인쇄합니다. 따라서 k은 유형 서명에 나타나서 유형 변수 s이 모든 종류의 값일 수 있음을 의미합니다. (사용 방법으로 인해 b은 종류가 *이므로 종류가 다형 적이 지 않으므로 그 종류가 나열되지 않습니다.그것은, 너무 승진 5 튜플을 사용하고

    (SingI Nat a, SingI Nat b, SingI Nat c, SingI Nat d, SingI Nat e) => StaticSize ((,,,,) Nat Nat Nat Nat Nat) ((,,,,) Nat Nat Nat Nat Nat a b c d e) 
    

    )이 얻을 수있는 방법 말도의 예로서

    , 여기 .. ​​내가 지금 일하고 있어요 도서관의 대구 워드 프로세서에서 예입니다. 튜플이 종류와 유형 모두로 표시된다는 것을 의미하기 때문에 그냥 바보가됩니다.