Come funziona il 'derivare' in Haskell?
Prima di tutto, derivare non funziona per un tipo di dati arbitrario. Per esempio, non potete confrontare le funzioni per l'uguaglianza.
Funziona per tutti i tipi di dati algebrici. Questo perché ci sono regole molto semplici per costruire tipi di dati algebrici. Li costruisci da tipi di dati primitivi usando prodotti e somme.
Il compilatore conosce tutti i tipi di dati primitivi, come unit (), Int, etc., e sa come implementare l'uguaglianza, show, e alcuni altri metodi di classe per loro.
Questi tipi primitivi possono essere combinati usando prodotti -- cioè tuple o record con nome. Se sapete come implementare, ad esempio, l'uguaglianza per i tipi primitivi, potete facilmente derivare l'uguaglianza per tuple o record. Lo stesso con show, ecc.
Oppure vengono combinati usando le somme, che sono le barre verticali nelle definizioni dei dati. Di nuovo, si possono facilmente implementare confronti, show, ecc. per le somme -- basta usare la corrispondenza dei pattern.
Similmente, ci sono regole per i tipi di dati parametrizzati e i tipi di dati ricorsivi. Provate ad implementare Eq o Show per un mucchio di tipi di dati algebrici, e capirete le regole. Sono interamente meccaniche e possono essere automatizzate.
È anche possibile implementare la derivazione per le classi tipo definite dall'utente, ma è più difficile. Dovete dire al compilatore come implementare i metodi della vostra classe tipo per tutti i tipi primitivi e per prodotti e somme generiche. Ma si può fare.
Articoli simili
- Il mio telefono è caduto e tutto funziona bene ma la mia scheda SD, che non è rotta, non funziona. Come posso recuperare i miei dati?
- C'è un'app che non funziona con Android 9 o 10 ma funziona bene con le versioni precedenti di Android. Come posso risolvere questo problema?
- Perché il mio 3G non funziona nel mio telefono? Prima andava bene, ma quando ho preso l'Idea 4G, la SIM 3G ora non funziona.
- Il mio auricolare non funziona bene, ma quando ho premuto sul giunto del jack e del filo funziona. Qual è il problema?