Pytanie Rekordy Haskella, czystsze podejście?


Czytałem o niektórych problemach z zapisami Haskella, w szczególności o tym, że dwa elementy w tym samym module nie mogą mieć tej samej nazwy.

Rozumiem, że możesz obejść to poprzez oddzielne moduły, ale nie chciałem tego zrobić i zamiast tego próbowałem tego podejścia:

class HasX a where
  x :: a -> X

data D1 = D1 { d1_x :: X, ... }
instance HasX D1 where
  x = d1_x

data D2 = D2 { d2_x :: X, ... }
instance HasX D2 where
  x = d2_x

(To tylko robi, a nie zestawy, oczywiście musiałbym napisać więcej kodu, by robić zestawy).

Wydaje się jednak, że deklaracje klas i instancji dla tego wszystkiego wyglądają jak wzorce, które powinny być możliwe do wyeliminowania za pomocą szablonu haskell lub czegoś innego.

Czy istnieje biblioteka lub rozszerzenie GHC, które sprawia, że ​​takie podejście jest mniej kłopotliwe w pisaniu?


12
2018-05-03 07:48


pochodzenie


Tak, ups. Naprawiony. - Clinton
Jest to nieco bardziej skomplikowane, ponieważ te dwa pola mogą nie mieć tego samego typu. - augustss
Dla moich celów przyjmijmy, że pola o tej samej nazwie mają ten sam typ. Nie będę mieć pól o tej samej nazwie mających różne typy. - Clinton


Odpowiedzi:


Wydaje się Data.Has zawiera dużo tego, czego szukasz. W ich słownictwie myślę, że ich Knows klasa typu jest bliżej Ciebie Has, a także zapewnia również podpis do wstrzykiwań.

Używają również mechanizmu etykietowania do rozwiązania problemu, który nie wydaje mi się, abyś jeszcze rozważał: rekordy zawierające pola, które mają ten sam typ. Używają one etykiet poziomu, aby dokonać takiego ujednoznacznienia.

Dla wygody istnieje również pewne wsparcie, które zapewnia generator dla Has instancja z szablonem Haskell w Ma-TH

Możesz znaleźć więcej etykiet poziomu i innych materiałów związanych z nagraniami w pracach Olega typu magika, takich jak OOHaskell (również z Ralfem Lämmelem).


6
2018-05-03 09:10



Czy możesz wskazać mi jakąś dokumentację stylu samouczka dla Data.Has (i Has-TH z tego powodu). Wygląda mniej więcej tak, jak tego szukam, ale nie jestem pewien, jak to wszystko połączyć. - Clinton
Właściwie to znalazłem Data.Has: github.com/nonowarn/has/blob/master/examples/Announce04.lhs - Clinton


data-accessor-template może przynajmniej pomóc w zapisaniu akcesorów typu set / get. Może niektórzy ludzie mogą wymyślić kod szablonu Haskella do generowania klas i instancji dla każdej nazwy pola rekordu. Jednak ja sam nie używam szablonów Haskell. Ogranicza się do GHC, a nawet do konkretnych wersji GHC, ponieważ szablon Haskell zmienia się między różnymi wersjami GHC. Posiadanie jednego (głównego) rekordu na moduł naprawdę się opłaca.


0
2018-05-10 10:26