2017-08-27 69 views
7

Nie tak dawno temu odkryłem typ danych Natural w base. To powinno być zrobione (jak mi się wydaje), kiedy zamierzasz używać nieujemnego typu całkowitego. Ale nie jest do końca jasne, dlaczego powinienem preferować Natural do Integer. Oba typy mają dowolną precyzję, obie mają zoptymalizowaną reprezentację środowiska wykonawczego - Integer representation i Natural representation. Ale Naturalcan throw pure exceptions po odjęciu liczb naturalnych, a to naprawdę nie dodaje więcej rodzajów bezpieczeństwa do kodu. Podczas gdy Integer jest bardziej popularny we wszystkich pakietach.Kiedy wybrać "Naturalny" przez "Integer" w Haskell?

Kiedy i dlaczego mam korzystać z Natural?

+1

To może być nieco opiniotwórcze, ale moim kryterium byłoby: "jeśli wolisz błąd wykonania, aby uzyskać wynik negatywny, wybierz opcję" Naturalne "" – chi

+0

@chi Zgadzam się. Chociaż mamy 'negate' i' (-) 'wewnątrz klasy' Num', niewiele możemy zrobić, aby nie dopuścić do odejmowania. – Shersh

Odpowiedz

4

Nie rozumiem, dlaczego chcesz używać Natural lub Integer. Dlaczego zamiast tego użyć Rational? Jest to arbitralna precyzja, ma zoptymalizowaną reprezentację środowiska wykonawczego i działa dla naturałów, liczb całkowitych, i racjonalnych!

Chodzi mi o to, że powinniśmy wybrać typ, który ma sens semantycznie. Liczyć domy na ulicy z naturals, nagrać naszą następną grę w golfa z liczbami całkowitymi i podzielić świeże ciasto z jagodami z wymyśleniami.

+0

Nie wiem, jakie części (jeśli są) tego mają na myśli sarkastycznie. Myślę, że powinieneś lepiej opisać swoją opinię. – leftaroundabout

+0

@leftaroundabout Zachęcam do dodania drugiej odpowiedzi w innym stylu retorycznym. – erisco

+0

@erisco Powodem wyboru "Naturalnego" z powodu sensu semantycznego jest dobry powód. Ale wtedy: dlaczego nie "newtype Natural = Natural Integer"? 'Rational' jest znacznie wolniejsze niż' Integer' lub 'Natural' z powodu stałych wywołań funkcji' gcd'. Ale nie jest jasne, który z nich - "Natural" lub "Integer" - jest wolniejszy z powodu optymalizacji kompilacji i wstawiania i wszystkich tych rzeczy. Moje pytanie to nie tylko "duh, mam dwa typy, emm ... czego powinienem użyć? Jestem taki głupi, nie mogę wybrać ». Ale po co tworzyć taki "naturalny" typ z taką semantyczną. Dlaczego wyjątek zamiast nasycenia? Jakie korzyści mogę uzyskać? – Shersh