Approfondimento sulle classi
Classi predefinite

Il diagramma qui sopra riassume alcune delle classi più importanti
predefinite nella libreria standard di Haskell. Le classi sono
rappresentate dai riquadri rossi. Ogni classe è identificata da un
nome – ad esempio Eq o Num – e per ogni classe sono
indicate alcune funzioni/operazioni definite sui tipi istanza di
quella classe. Le linee continue descrivono la relazione di
ereditarietà tra le classi, in particolare la relazione $C \to
D$ indica che $C$ è sotto-classe di $D$, e dunque le operazioni
disponibili per le istanze di $D$ sono disponibili anche per le
istanze di $C$. I riquadri verdi descrivono alcuni tipi di dato
primitivi, mentre le frecce tratteggiate mostrano le classi di cui
tali tipi sono istanza. Ad esempio, Int è istanza di Bounded
e di Integral, e dunque indirettamente di Enum, Real,
Num, Ord, Eq.
È possibile ottenere informazioni su una classe, incluse le
operazioni e le funzioni definite per le istanze di quella classe,
con il comando :info di GHCi.
:info Num
:info Eq
:info Ord
Eq
Eq è la classe dei tipi sui quali sono definite le relazioni di
uguaglianza == e disuguaglianza /=. Molti tipi sono istanza
di Eq, ma non il tipo delle funzioni. In particolare, non è
possibile confrontare due funzioni per determinare se sono “uguali”
o “diverse”.
:type (==)
:type (/=)
Ord
Ord è la classe dei tipi per i quali esiste un ordine
totale. Su questi tipi sono definite le relazioni d’ordine <,
>, <= e >=, oltre al calcolo di minimo min e massimo
max.
:type (<)
:type min
Enum
Enum è la classe dei tipi “enumerati” i cui elementi hanno un
successore e un predecessore.
:type succ
:type pred
Bounded
Bounded è la classe dei tipi “limitati” i quali hanno un elemento
più piccolo di tutti minBound e un elemento più grande di tutti
maxBound.
:type minBound
:type maxBound
Num e sotto-classi
La classe Num comprende tutti i tipi che rappresentano numeri di
varia natura.
- Tutti i numeri supportano le usuali operazioni aritmetiche di
somma
+, sottrazione-, moltiplicazione*, valore assolutoabse negazionenegate. - Sui tipi della classe
Integralsono definite le operazioni di divisione interadive resto della divisione interamod. - I tipi della classe
Fractionalrappresentano numeri “con virgola” e supportano le operazioni di divisione non intera/e calcolo del reciprocorecip. - I tipi della classe
RealFracsupportano le operazioni di troncamentotruncatee arrotondamentoround. - I tipi della classe
Floatingrappresentano numeri in virgola mobile e comprendono la rappresentazione di π, le funzioni di esponenzialeexpe logaritmolog, la radice quadratasqrte l’esponenziazione**, le funzioni trigonometriche.
:type (+)
:type (/)
:type sin
Esercizi
- Usare GHCi per scoprire il più piccolo ed il più grande numero di
tipo
Int.minBound :: Int maxBound :: Int - Mostrare che le funzioni
succepreddella classeEnumsono parziali, ovvero non sempre definite per tutti i valori di un tipo istanza diEnum.pred (minBound :: Int) succ (maxBound :: Int) - C’è una caratteristica del diagramma delle classi qui sopra che
lascia intendere che
Integersia un tipo di numeri interi di dimensione arbitraria. Quale?Integernon è istanza diBounded, dunque non c’è a priori un più piccolo/grande valore di tipoInteger. - Immaginare le classi di cui può essere istanza il tipo
Bool.:info Bool