Piszę funkcję deriveMyTypeClass ::Q [Dec] Gdzie, biorąc pod uwagę nazwę typu, idę nad jego konstruktorami i instancji typeClass, które napisałem na podstawie struktury.

Moja klasa typu wygląda:

class MyTypeclass a where
  type Foo a
  f :: a -> a -> Foo a 
  g :: Foo a -> a -> a 

W mojej funkcji deriveMyTypeclass, jaką deklarację powinienem przekazać InstanceD, aby zaspokoić deklarację rodziny typu. Czy byłoby TySynInstD?

W tej chwili mam coś wzdłuż linii:

deriveMyTypeclass :: Name -> Q [Dec] 
deriveMyTypeclass tyName = do 
... blah blah blah reify tyName ...
return $ [
  InstanceD Nothing [] 
            (AppT (ConT ''MyTypeclass) (ConT tyName) 
            [ -- declarations go here
            , TySynInstD $ ????? 
            , FunD 'f ... 
            , FunD 'g ...
            ]
   ]

Każda pomoc jest mile widziana :)

Str.s. Używam wersji szablon-Haskell-2.14.0.0, ale jeśli Twoje rozwiązanie wymaga 2.15, a potem rozważymy aktualizację.

1
Matt Ahrens 15 styczeń 2020, 21:07

1 odpowiedź

Najlepsza odpowiedź

Dzięki komentarzu Józefa do mojego pytania znalazłem moją odpowiedź. Na wszelki wypadek, gdyby ktoś potyka się na to pytanie, wystąpi instancję typeClass z instancją rodzinną:

InstanceD Nothing [] 
         (AppT (ConT ''MyTypeclass) (ConT tyName)) 
         [TySynInstD ''Foo 
                     (TySynEqn [ConT tyName] {{THE RIGHT HANDSIDE TYPE HERE}})
         , FunD ....
         , .....
         ] 

Byłem pierwotnie zdezorientowany co do tego, jak nazwa rodziny typu (foo) i tego typu instanka, którą umieściłem na (Tyname). Tutaj jest składa się jako nazwa rodziny typu nazwa ('' foo), lista typów do instancji zmiennej typu foo (cont Tyname), a następnie typ prawej strony.

0
Matt Ahrens 17 styczeń 2020, 18:13