2012-08-22 12 views
30

Model HList package został oparty na technologii Haskell starożytnej. Proste pytanie brzmi: biorąc pod uwagę wszystkie wspaniałe nowe cechy rozwoju Haskell/GHC ostatnich 8 lat, czy "nowoczesna" HList byłaby zbudowana inaczej? Zdaję sobie sprawę, że odpowiedź tutaj może być no, że dla konkretnego przypadku HList zastosowana technologia nadal daje najbardziej eleganckie rozwiązanie."Nowoczesne" HList?

Przeczytałem wiele pozycji udokumentowanych na stronie extensible records, jedynym rzeczywistym konkurentem (tj. Takim, który jest zaimplementowany jako biblioteka dostępna w hakowaniu) jest records package. A może brakuje linków z extensible records?

Odpowiedz

11

Pytanie któregokolwiek z tych pakietów jest zakresem jego celów. HList to właściwie 5 różnych implementacji etykiet, dwóch typu równości, dwóch typów rzutowania, dwóch rekordów/RecordP i wariantu Variant kontra TIC. Wszystkie są podobne, ale różnią się pod względem łatwości użytkowania, przenośności i używanych rozszerzeń.

Nowsze funkcje GHC (GADTs, powiązane typy, rodzaje ograniczeń, typy polimorficzne, typy singleton) mogą zezwalać na nieco inne kompromisy. W szczególności typy singleton mogą pozwolić na lepsze etykiety, a typy polimorficzne mogą pozwolić na bardziej elegancki Type/Data/Generics.

Pakiet „rekordy” link do zależy od „rodzaje” pakietu, który twierdzi:.

„Haskell nie ma wsparcia dla subkinds i polimorfizmu subkind Jednak pakiet ten może być używany do emulowania subkinds rodzajów zmiennych podtypów * i . "

Ale to już nie jest prawdą, ponieważ promuje się typ danych w nowych wersjach GHC. Ten pakiet w styczniu 2012 r. Może być teraz trochę przestarzały.

Co do zapisów, być może nowy system będzie czerpał z najnowszej serii soczewek polimorficznych: lens i/lub lens-family.

+2

Właśnie omawiałem relację między soczewkami a rozszerzalnymi zapisami z Russellem (O'Connorem) właśnie dziś rano - i nie jest to jasne. Obiektywy są świetne do abstrakcyjnego pobierania/zestawienia pojedynczego pola w agregacie, ale mniej dobrze reprezentują sam agregat. W każdym razie wydaje mi się, że powinienem trzymać się HList (na razie), a następnie spróbować znaleźć, które z zionów wariantu I powinienem wybrać, by poradzić sobie z danym problemem (co tłumaczy jakiś kod O'Camla, który używa polimorficznego warianty I typy rzędów AND Funktory w Haskell). –

+2

Zrobiłem ostatnio coś inspirowanego przez HList: biorąc pod uwagę rzecz zależną od typu (TIP) i {program obsługi jednego z przypadków} ona zwraca {wynik obsługi) lub {TIP o mniejszym typie} . Łączenie łańcuchów razem z> => zmniejszało wielkość TIP dla każdego przypadku. W tamtym czasie pomyślałem, że to rodzaj symulowanego wzoru pasującego do odmian polimorficznych. –

Powiązane problemy