Czytam o Algebraicznych Typach Danych (dzięki Richardowi Minerichowi znalazłem to doskonałe wyjaśnienie pojęcia). Chociaż myślę, że rozumiem pojęcie rodzajów sum i typów produktów itp., Nie do końca rozumiem, w jaki sposób Algebraiczne typy danych są przydatne poza określaniem dopasowania wzorca. Co jeszcze można zrobić z ADT poza dopasowaniem wzorca?
EDYCJA: Nie pytam, co programista może zrobić z ADT, czego nie można zrobić z obiektami. Pytam, czy są inne operacje, na które pozwalają ADT; na przykład, czy można zrobić dodatkowe uzasadnienie dotyczące typów zaangażowanych, jeśli zastosowane są ADT? Czy narzędzia ADT ułatwiają analizę typów, która bez nich nie byłaby możliwa?
functional-programming
data-types
Onorio Catenacci
źródło
źródło
Odpowiedzi:
Algebraiczne typy danych różnią się tym, że można je zbudować z kilku rodzajów „rzeczy”. Na przykład Drzewo może nie zawierać niczego (Puste), Liścia lub Węzła.
Ponieważ Węzeł składa się z dwóch Drzew, algebraiczne typy danych mogą być rekurencyjne.
Dopasowanie wzorca pozwala na dekonstruację typów danych algebraicznych w sposób zapewniający bezpieczeństwo typu. Rozważ następującą implementację głębokości i jej ekwiwalentu pseudokodu:
w porównaniu do:
Ma to tę wadę, że programiści muszą pamiętać o opróżnieniu przed Leaf, aby pole1 nie było dostępne w pustym drzewie. Podobnie sprawa Liścia musi zostać zadeklarowana przed sprawą Węzła, aby pole 2 nie było dostępne w Liściu. W związku z tym język nie zapewnia bezpieczeństwa typu, ale raczej nakłada dodatkowe obciążenie poznawcze na programistę. Nawiasem mówiąc, pobieram te przykłady bezpośrednio ze stron wikipedii.
Oczywiście język kaczątkowy mógłby zrobić coś takiego:
Algebraiczne typy danych mogą nie być ściśle lepsze niż ich odpowiedniki OOP, ale zapewniają inny zestaw napięć do pracy przy tworzeniu oprogramowania.
źródło
Nie jestem pewien, czy to wyjaśnienie jest tak doskonałe.
Algebraiczne typy danych są używane do tworzenia struktur danych, takich jak listy i drzewa.
Na przykład drzewa analizy są łatwo reprezentowane przez algebraiczne struktury danych.
Reprezentacja języka C. nie wymagałaby aż tak dużo więcej.
Ale tak naprawdę możesz zrobić WSZYSTKO z algebraicznymi typami danych. Lisp udowadnia, że możesz zrobić wszystko za pomocą par, a narzędzia ADT po prostu zapewniają bardziej szczegółowy i bezpieczny sposób na to podejście.
Oczywiście, jeśli zapytasz: „Co możesz zrobić z ADT, czego nie możesz zrobić z przedmiotami?”, Odpowiedź brzmi „nic”. Tylko czasami (głównie) okaże się, że rozwiązania ADT są znacznie mniej szczegółowe, a te oparte na obiektach są prawdopodobnie bardziej elastyczne. Aby umieścić go w drzewie analizy reprezentowanym przez narzędzia ADT:
źródło