Pochodząc z języka C ++ nie rozumiem, dlaczego jako obywatel pierwszej klasy potrzebne są typy / wyrażenia typu? Jedynym znanym mi językiem obsługującym tę funkcję jest Aldor.
Czy ktoś ma literaturę na temat typów jako obywatel pierwszej klasy lub wie, dlaczego jest to przydatne?
Odpowiedzi:
Typy pierwszej klasy umożliwiają coś, co nazywa się pisaniem zależnym . Umożliwiają one programiście stosowanie wartości typów na poziomie typu. Na przykład typ wszystkich par liczb całkowitych jest typem regularnym, a para wszystkich liczb całkowitych z lewą liczbą mniejszą niż prawa liczba jest typem zależnym. Standardowym przykładem tego są listy zakodowane długością (zwykle nazywane
Vector
w Haskell / Idris). Poniższy pseudo-kod jest mieszanką Idris i Haskell.Ten fragment kodu mówi nam dwie rzeczy:
cons
umieszczenie elementu na liście tworzy listę długościn + 1
Wygląda to bardzo podobnie do innej koncepcji z 0 i
n + 1
prawda? Wrócę do tego.Co z tego zyskujemy? Możemy teraz określić dodatkowe właściwości używanych funkcji. Na przykład: Ważną właściwością
append
jest to, że długość wynikowej listy jest sumą długości dwóch list argumentów:Ale w sumie ta technika nie wydaje się przydatna w codziennym programowaniu. Jak to się ma do gniazd,
POST
/GET
żądań i tak dalej?Cóż, nie robi tego (przynajmniej nie bez znacznego wysiłku). Ale może nam pomóc na inne sposoby:
Zależne typy pozwalają nam formułować niezmienniki w regułach kodu, tak jak funkcja musi się zachowywać. Korzystając z nich, zyskujemy dodatkowe bezpieczeństwo dotyczące zachowania kodu, podobne do warunków wstępnych i końcowych Eiffela. Jest to niezwykle przydatne do automatycznego potwierdzania twierdzeń, co jest jednym z możliwych zastosowań Idris.
Wracając do powyższego przykładu, definicja list zakodowanych długością przypomina matematyczną koncepcję indukcji . W Idris możesz sformułować pojęcie indukcji na takiej liście w następujący sposób:
Ta technika ogranicza się do konstruktywnych dowodów, ale mimo to jest bardzo potężna. Możesz spróbować pisać
append
indukcyjnie jako ćwiczenie.Oczywiście typy zależne są tylko jednym zastosowaniem typów pierwszej klasy, ale prawdopodobnie jest to jeden z najczęstszych. Dodatkowe zastosowania obejmują na przykład zwracanie określonego typu z funkcji na podstawie jej argumentów.
Jest to nonsensowny przykład, ale pokazuje coś, czego nie można naśladować bez typów pierwszej klasy.
źródło