2011-12-03 26 views
13

Lubię umieszczać podpisy typów dla wszystkich definicji najwyższego poziomu w moim kodzie. Jednak sygnatury typu w deklaracjach instancji nie wydają się być dozwolone, a jeśli dodaję jeden, otrzymuję błąd "Misplaced type signature" od GHC. Dlaczego tak jest? Dlaczego GHC nie może sprawdzić, czy podpis typu jest taki sam, jak oczekiwano, i odrzucić (lub ostrzec), jeśli nie jest?Dlaczego nie można umieścić sygnatury typu w deklaracji wystąpień w Haskell?

+3

Na [bilet, który otworzyłem] (http://hackage.haskell.org/trac/ghc/ticket/5676) SPJ skomentował: "Chciałem samemu [wpiszcie podpisy w deklaracjach instancji], więc mam zrobiłem to w wolnej chwili. " Obecnie określa kamień milowy GHC 7.6, choć jest niewielka szansa, że ​​trafi do GHC 7.4. Dziękuję za pytanie! I dziękuję, Daniel Fischer, za sugestię, że robimy bilet. –

Odpowiedz

10

Możesz utworzyć funkcje osobno, poza instancją instancji, jeśli chcesz uzyskać deklaracje typów, na przykład .

class Class a where 
    f1 :: a -> a 

instance Class Foo where 
    f1 = foo_f1 

--monomorphic version of f1 for Foo: 
foo_f1 :: Foo -> Foo 
foo_f1 = ... 
4

Ponieważ podpis jest częścią definicji klasy, podpis typu w deklaracji instancji byłby duplikatem podpisu. Nie sądzę, aby istniał problem z zezwoleniem na duplikowanie sygnatur, ale nie ma żadnej korzyści, jeśli chodzi o zezwolenie na nie, i łatwiej jest je odrzucić. Tak więc definicja języka mówi, że może istnieć co najwyżej jeden typ podpisu na jednostkę. Funkcja zezwalania na podpisy również w deklaracjach instancji nie była wymagana za dużo, więc nie ma na to zezwolenia. Jeśli naprawdę tego chcesz, możesz zgłosić żądanie funkcji na GHC trac. Jeśli uzyska wystarczające zainteresowanie, może zostać wdrożone (ale nie oczekuję, że popyt będzie wysoki).

+1

Zaletą jest to, że GHC sprawdzi podpis - programista może potwierdzić swoje przekonanie o typie podpisu i sprawić, że zostanie on sprawdzony i złapany na wypadek, gdyby był nieprawidłowy. – Prateek

+1

@Prateek Kompilator sprawdza mimo to podpis w klasie. Ponieważ każdy podpis oprócz definicji klasy (z odpowiednimi zmiennymi typu zastępującymi typy instancji) musi zostać odrzucony, nie może podać żadnych dodatkowych informacji ani bezpieczeństwa. To byłaby tylko dodatkowa dokumentacja dla czytelników kodu (to nie jest złe, ale możesz to teraz osiągnąć z podpisami w komentarzach - robię to, jeśli uważam, że typy nie są oczywiste i dobrze znane). –

+4

Chciałem sprawdzić, co programista uważa za podpis (poza sprawdzeniem podpisu w klasie). To nie daje żadnego dodatkowego bezpieczeństwa, prawda. Ale może dać bardziej zrozumiałe komunikaty o błędach: "uważasz, że podpis typu to X, ale w rzeczywistości jest to Y" zamiast jakiegoś innego typu błędu. Ponadto pozwala programistom na przyjęcie jednolitego stylu deklaracji typu pisania, zamiast konieczności specjalnego komentowania go wewnątrz deklaracji instancji. – Prateek

3

W każdym przypadku typ jest zbędny i jeden normalnie chce uniknąć zwolnień. W Frege dozwolone jest jednak pisanie podpisów typu dla członków instancji. Są sprawdzane, a następnie wyrzucane. Oczywiście łatwiej jest im zakazać od razu.

+2

Redundancja jest czasami dobra. – ThePiercingPrince

11

Można dodawać podpisy typów dla instancji za pomocą [nowego] -XInstanceSigs, co jest szczególnie przydatne przy wprowadzaniu zmiennych typu do zakresu. Więcej informacji można znaleźć w official docs.