ich eine „lineare“ Art Familie habe, dh von der FormInvertierung eine Art Familie
type family Foo a
type instance Foo T1 = T2
type instance Foo T2 = T3
...
type instance Foo T9 = T10
In meinem particualr Anwendungsfall, es ist sehr bequem, die „umgekehrte“ Familie FooRev
und dann zu definieren, erzwingen die Einschränkung (FooRev (Foo x) ~ x)
:
type family FooRev a
type instance FooRev T10 = T9
type instance FooRev T9 = T8
...
type instance FooRev T2 = T1
die umgekehrte Familie GHC viele Arten ableiten können, die ansonsten aufgrund nicht injectivity mehrdeutig sein würde. Es ist im Wesentlichen die gleiche Idee, die vorgeschlagen wurde here. Diese Lösung funktioniert ziemlich gut, aber es ist ärgerlich, programmatisch und fehleranfällig, eine "umgekehrte" Familie zu definieren, indem man alle Fälle auflistet. Gibt es eine allgemeinere Möglichkeit, die Rückseite einer linearen Familie wie Foo
zu definieren?
Vielleicht könnten Sie 'Daten' Familien stattdessen irgendwie verwenden, die bekannt sind injective. Nicht sicher, ob es zu Ihrem Problem passt. – luqui
Metaprogrammierung (d. H. Vorlage Haskell) könnte beide generieren, halten Sie Ihren Code DRY, wenn das Ihr Anliegen ist. Andernfalls könnten Sie eine Zuordnungsliste auf Typfläche, eine Suche auf Typfläche, eine Map-Swap auf Typpebene und beide Typfamilien aus der Liste ableiten. – chi
@luqui Ich habe das gerade vor dem Posten gesehen, aber soweit ich weiß, ist das nicht wirklich das, was ich brauche. In meinem Fall sind die "Ti" alle Typ "Bar a b c", wo sich die Typparameter ändern. Das passt nicht in eine Datenfamilie, oder? – crockeea