Sto lavorando ad un'esercitazione di base Haskell configurata come segue: viene creata una definizione di dati, dove Zero
è dichiarato come e una serie di numeri (stampati per nome, quindi, ad esempio, four
) fino a ten
è costruito con questo.Modo efficiente per scrivere istanze di ordinazione?
Non ho avuto troppi problemi nel comprendere come funziona la dichiarazione delle istanze Eq
(a parte il fatto che non è stata fornita una spiegazione esatta della sintassi), ma ho difficoltà a dichiarare tutte le istanze di cui ho bisogno per Ord
- Devo essere in grado di costruire un ordinamento sull'intero insieme di numeri, in modo tale da ottenere True
se inserisco "dieci> nove" o qualcosa del genere.
In questo momento, ho questo snippet di codice. Le prime due righe dovrebbero essere corrette, poiché le ho copiate (come dovevo) dall'esercizio stesso.
instance Ord NaturalNumber where
compare Zero Zero = EQ
compare Zero (S Zero) = LT
compare (S Zero) Zero = GT
compare x (S x) = LT
Le prime quattro linee funzionano bene, ma non possono trattare i casi come "confronto quattro cinque", e qualcosa di simile a quello che ho scritto nella scorsa non funziona anche se di tipo I in qualcosa di simile compare four four = EQ
: viene visualizzato un errore "definizioni in conflitto", presumibilmente perché lo x
viene visualizzato due volte. Se scrivo qualcosa come compare two one = GT
, invece, ricevo un avviso di "corrispondenza modello (i) sono sovrapposti", ma funziona. Tuttavia, ottengo anche il risultato GT
quando inserisco compare one two
nella reale piattaforma Haskell, quindi chiaramente qualcosa non funziona. Ciò accade anche se aggiungo compare one two = LT
sotto quella linea.
Così chiaramente non riesco a completare questa descrizione delle istanze di Ord
scrivendo ogni istanza di cui potrei aver bisogno, e anche se potessi, sarebbe incredibilmente inefficiente scrivere tutte le 100 istanze a mano.
Qualcuno può darmi un suggerimento su come posso risolvere questo problema e terminare la costruzione di un meccanismo di ordinazione?
Nota: sono un principiante assoluto di Haskell. È possibile che io non conosca abbastanza bene la sintassi, soprattutto perché in genere ho trovato la documentazione per altre lingue che ho usato più facilmente, ma sento che non è l'unico problema qui. – Maroon
Sembra che tu voglia usare la ricorsione nell'ultimo caso, e avere qualcosa come '' 'compare (S x) (S y) = confronta x y'''. Inoltre puoi usare il carattere di sottolineatura '' '_''' per descrivere che non ti interessa un caso dettagliato, come' '' compare (S _) Zero = ... '' 'per notare che non ti interessa la dimensione del primo numero purché tu sappia che è> = 1 e il secondo è Zero. –