Powiedzmy mam klasę:klasa uogólniania Parametry
class C a b t where
f :: (a, b) -> (t a, t b)
Teraz z tej definicji, mogę określić instancje dla słownie:
(a,b) -> (Maybe a, Maybe b)
(a,b) -> ([a], [b])
ale nie dla (o ile rozumiem):
(a,b) -> (a,b)
(a,b) -> ((a, a), (b, b))
mogłem zamiast zmienić definicję klasy tak:
type family T a b x
class C a b where
f :: (a, b) -> (T a b a, T a b b)
co pozwoliłoby mi zrobić wyżej, ale wtedy byłbym w stanie zadeklarować tylko jeden f
dla każdego a
i b
.
Zasadniczo chcę móc przekazać rodzinę typów jako t
w oryginalnej definicji, która jest domyślnie rozstrzygnięta przez moduł sprawdzania typu, o ile jest znany. Nie chcę po prostu zrobić tego jako f :: (a, b) -> (c, d)
, ponieważ chcę zachować niezmiennik, że zarówno a
, jak i b
mają to samo zadanie, więc swap . f
jest tego samego typu co f . swap
. Myślę, że mogę potrzebować injective type families (z GHC 8.0), ale nie jestem pewien. Ale może jest inny sposób?
Brak odpowiedzi: możesz użyć "Tożsamości" w pierwszym przypadku i odpowiedni typ nowego w drugim (teraz nie mogę wymyślić żadnego standardowego). To proste obejście problemu, ale może okazać się mniej bolesne, niż wymaga tego zaawansowana sztuczka. Nawiasem mówiąc, "nie chcę tego po prostu zrobić' f :: (a, b) -> (c, d) 'ponieważ chcę zachować niezmiennik ..." brzmi bardzo podobnie do kwestii Obiektywy * z soczewkami to "Lens Stab" [nawet jeśli te cztery parametry są wzajemnie zależne] (http://comonad.com/reader/2012/mirrored-lenses) (zobacz sekcję "Dlaczego to rodzina soczewek?" Poczta). – duplode
Myślę, że jest to zasadniczo to samo pytanie, co http://stackoverflow.com/questions/4922560/why-doesnt-typesynonyminstancje-wyraz-partially-applied-type-synonyms-to-be-use –