Załóżmy, że mam następujące klasy:klasy dziedziczenie typu Haskell
class P a where
nameOf :: a -> String
chciałbym oświadczyć, że wszystkie instancje tej klasy są automatycznie przypadki Show
. Moja pierwsza próba będzie następujący:
instance P a => Show a where
show = nameOf
moja pierwsza próba, aby przejść tędy wczoraj spowodowało warren królika rozszerzeń językowych: I po raz pierwszy powiedział, aby przełączyć się na elastycznych przypadkach następnie nierozstrzygalne instancje, a następnie pokrywające się przypadki, i wreszcie otrzymujemy błąd dotyczący nakładania się deklaracji instancji. Poddałem się i wróciłem do powtórzenia kodu. Zasadniczo jednak wydaje się to bardzo prostym żądaniem, które powinno być łatwo zaspokojone.
Więc dwa pytania:
- Czy jest trywialnie prosta droga do tego, że ja po prostu brakowało zrobić?
- Dlaczego pojawia się problem nakładających się instancji? Rozumiem, dlaczego potrzebuję
UndecidableInstances
, ponieważ wydaje mi się, że naruszam warunek Patersona, ale tutaj nie ma nakładających się instancji: nie ma nawet takich przypadków, nawetP
. Dlaczego typechecker wierzy, że istnieje wiele instancji dlaShow Double
(jak się wydaje w przypadku tego zabawkowego przykładu)?
Nakładanie (i rozdzielczość przeciążania) jest określane przez samą instancję "Show a", więc faktycznie nakłada się z każdą inną instancją 'Show'. – augustss
Załóżmy, że deklarujesz wystąpienie 'P Int' i masz już instancję' Show Int', co spowoduje nakładanie się instancji dla Show. – Satvik
@Satvik Pewnie, z tym wyjątkiem, że nie mam w pobliżu instancji 'P Int'. Spodziewam się błędu, jeśli spróbuję stworzyć "P Int", ale nie po prostu oświadczając, że może istnieć. – Impredicative