2014-04-27 11 views
9

Czy w Haskell można zdefiniować typ danych w zakresie funkcji? Na przykład piszę funkcję f :: [(Char, Int)] -> [(Char, String)]. W implementacji funkcji zbuduję drzewo z listy wejściowej, a następnie przetestuję drzewo, aby zbudować listę wyjściową. Jednym z rozwiązań jest zdefiniowanie nowego typu danych Drzewa specyficznego dla mojego problemu, wraz z dwiema funkcjami pomocniczymi, jedną do przetłumaczenia listy wejściowej do drzewa i drugiej, aby przejść drzewo i zbudować listę wyjściową.Haskell: Definiowanie nowego typu danych z zakresem funkcji

Teraz dwie funkcje pomocnicze można łatwo przeciągnąć do zakresu f, umieszczając je w klauzuli where, ale co z drzewem tymczasowym typu nonce? Brudny wydaje się obszar nazw, definiując go poza zakresem funkcji, ale nie wiem, jak to zrobić.

Dla kontekstu, okazuje się, że obliczam kodowanie Huffmana. Nie jestem szczególnie zainteresowany znalezieniem alternatywnego algorytmu w tym punkcie, ponieważ podejrzewam, że często będzie użyteczne w Haskell, aby zdefiniować typy danych pomocniczych między funkcjami pomocniczymi, więc jestem zainteresowany ogólnymi podejściami do tego.

+12

Wszystkie deklaracje typów danych muszą znajdować się na najwyższym poziomie. Jeśli nie chcesz zanieczyszczać przestrzeni nazw, po prostu nie eksportuj typu danych. – user2407038

+0

[This] (http://stackoverflow.com/questions/15320391/proposal-for-local-data-declarations- instance) mogą być odpowiednie. – is7s

Odpowiedz

6

Nie, to niemożliwe.

W modułach Haskella i importach kwalifikowanych mają zostać rozwiązane wszystkie problemy związane z tworzeniem przestrzeni nazw, takie jak Twoja lub notoryczne kolizje nazw pól rekordu.

Chcesz, aby typ był widoczny tylko dla określonej funkcji? Umieść ten typ i tę funkcję w nowym module i (opcjonalnie) wyeksportuj tylko tę funkcję.

Oczywiście, stosując się do tej konwencji, otrzymasz więcej modułów niż zwykle, ale jeśli się nad tym zastanowisz, to tak naprawdę nie różni się ona od wielu innych języków. Na przykład w języku Java konwencjonalne jest umieszczanie każdej klasy w oddzielnym pliku, bez względu na to, jak mała jest klasa.

Muszę jednak wspomnieć, że z dala od większości ludzi w społeczności faktycznie postępuje się zgodnie z tą konwencją. Często można zobaczyć tajemnicze nazwy używane do obejścia tego. Osobiście nie uważam takiego podejścia za bardzo czyste i wolałbym raczej polecać używanie modułów.

Powiązane problemy