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ń:
- myślałem
OverlappingInstances
pozwoli mi rozwiązać instancji, ale pojawia się ten sam błąd. IncoherentInstances
powinien zdecydowanie pozwól mi skompilować ... prawda? Ale tak nie jest.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
.