8

Próbuję uzyskać show coś z typu Tagged s b (Data.Tagged) w module, który również importuje z biblioteki accelerate. Niestety, biblioteka przyspieszenia określa instancji pokazaćRozwiązywanie nakładających się instancji w bibliotece zewnętrznej

instance Kit acc => Show (acc aenv a) where 

w Data.Array.Accelerate.Pretty.hs. Odczytując trochę, nic nie mogę zrobić, aby uniknąć importowania tego wystąpienia, które oczywiście nakłada się z instancją Data.Tagged Show. W rzeczywistości ogólna instancja przyspieszająca uniemożliwia wydrukowanie czegoś w rodzaju *->*->*.

Oto prosty przykład, który pokazuje problem:

{-# 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) 

Błąd:

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' 

mam kilka pytań:

  1. myślałem OverlappingInstances pozwoli mi rozwiązać instancji, ale pojawia się ten sam błąd.
  2. IncoherentInstances powinien zdecydowanie pozwól mi skompilować ... prawda? Ale tak nie jest.
  3. Dlaczego raport GHC Data.Tagged pokazać wystąpienie jako Show (Tagged k s b) gdy instancja (skopiowane z Data.Tagged) wynosi:

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

wierzę, że widział, gdzie udało mi się tylko aby rozwiązać nakładające się instancje, dodając jawny typ podpisu (aby wymusić na GHC najbardziej specyficzne wystąpienie), ale ponieważ mój przykład jest na najwyższym poziomie i nie zawiera polimorfizmu, nie wiem, o ile bardziej wyraźnie mogę być na temat typy. Mam wrażenie, że GHC powinien mieć możliwość wybrania instancji Data.Tagged, ponieważ (myślę) Tagged nie jest instancją Accelerate.Base.Kit i dlatego nie spełnia ograniczeń instancji (wiem, że pasujemy tylko do RHS z instancja, ale GHC powinien być w stanie zorientować się, że jeden z przypadków nie mógłby zastosować ...)

EDIT

stworzyłem raport o błędzie here, a instancja wykraczająca jest teraz usuwany w głowie repo. Poniżej znajduje się świetna odpowiedź na pytanie 3, ale nadal jestem zainteresowany tym, dlaczego nie działa OverlappingInstances/IncoherentInstances.

Odpowiedz

5

wiem tylko odpowiedź na 3.

Gdy typ jest skompilowany z -XPolyKinds i bez ograniczeń co do rodzaju zmiennej typu, GHC drukuje typ bardzo źle. Po nazwie typu wypisuje listę rodzajów wszystkich polimorficznych zmiennych typu, a następnie zmiennych typu. Tak więc k pojawiający się w sygnaturze typu oznacza, że ​​zmienna typu s może być dowolnego rodzaju. (Ze względu na sposób, w jaki jest używany, b musi mieć rodzaj *, więc nie jest to rodzaj-polimorficzny, więc jego rodzaj nie jest wymieniony.)

Jako przykład jak śmiesznie to może dostać, oto przykład z docs plamiaka w bibliotece pracuję teraz na ..

(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) 

To użyciu promowane 5-krotny, too. To sprawia, że ​​jest to wyjątkowo głupie, ponieważ oznacza to, że krotka pojawia się zarówno w rodzaju, jak iw typie.

Powiązane problemy