Pracuję nad podstawowym ćwiczeniem Haskella, które jest ustawione w następujący sposób: definiowana jest definicja danych, gdzie Zero
jest zadeklarowana jako NaturalNumber
, oraz seria liczb (wydrukowana po nazwie, na przykład four
) aż do ten
jest skonstruowany z tym.Wydajny sposób pisania wystąpień zamawiania?
Nie miałem większych kłopotów ze zrozumieniem, jak działają deklaracje instancji Eq
(oprócz braku dokładnego wyjaśnienia składni), ale mam problem z zadeklarowaniem wszystkich potrzebnych instancji dla Ord
- Muszę być w stanie zbudować zamówienie na cały zestaw liczb, tak, że dostanę True
, jeśli wprowadzę "dziesięć> dziewięć" lub coś podobnego.
W tej chwili mam ten fragment kodu. Pierwsze dwie linie powinny być poprawne, ponieważ skopiowałem je (tak jak powinienem) z samego ćwiczenia.
instance Ord NaturalNumber where
compare Zero Zero = EQ
compare Zero (S Zero) = LT
compare (S Zero) Zero = GT
compare x (S x) = LT
Pierwsze cztery linie działają dobrze, ale nie może zajmować się sprawami jak „porównać cztery pięć”, i coś podobnego do tego, co wpisane w ostatni nie działa nawet wtedy, gdy wpisuję w czymś takim compare four four = EQ
: Pojawia się błąd "sprzecznych definicji", prawdopodobnie dlatego, że x
pojawia się dwa razy. Jeśli zamiast tego napiszę coś takiego jak compare two one = GT
, otrzymam ostrzeżenie "dopasowania wzoru", ale działa. Jednak otrzymuję również wynik GT
po wprowadzeniu compare one two
do rzeczywistej platformy Haskell, więc wyraźnie coś nie działa. Dzieje się tak, nawet jeśli dodaję compare one two = LT
poniżej tego wiersza.
Tak więc nie mogę zakończyć opisu instancji Ord
, pisząc każdą możliwą instancję, a nawet gdybym mógł, byłoby niewiarygodnie nieefektywne wypisanie wszystkich 100 wystąpień ręcznie.
Czy ktoś może mi wskazać, w jaki sposób mogę rozwiązać ten problem i dokończyć konstrukcję mechanizmu zamawiania?
Uwaga: Jestem całkowicie początkującym w Haskell. Możliwe, że po prostu nie znam wystarczająco dobrze składni, szczególnie, że ogólnie znalazłem dokumentację dla innych języków, które czytałem, ale łatwiej mi je czytać, ale mam wrażenie, że to nie jedyny problem. – Maroon
Wygląda na to, że chcesz użyć rekursji w ostatnim przypadku i masz coś takiego jak "porównaj (S x) (S y) = porównaj x y" ". Możesz również użyć podkreślenia '' '_''', aby opisać, że nie interesuje Cię szczegółowa sprawa, np.' Porównaj (S _) Zero = ... '' ', aby zauważyć, że nie dbasz o rozmiar pierwszego numeru pod warunkiem, że znasz jego> = 1, a drugi zero. –