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 assolutoabs
e negazionenegate
. - Sui tipi della classe
Integral
sono definite le operazioni di divisione interadiv
e resto della divisione interamod
. - I tipi della classe
Fractional
rappresentano numeri “con virgola” e supportano le operazioni di divisione non intera/
e calcolo del reciprocorecip
. - I tipi della classe
RealFrac
supportano le operazioni di troncamentotruncate
e arrotondamentoround
. - I tipi della classe
Floating
rappresentano numeri in virgola mobile e comprendono la rappresentazione di π, le funzioni di esponenzialeexp
e logaritmolog
, la radice quadratasqrt
e 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
succ
epred
della classeEnum
sono 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
Integer
sia un tipo di numeri interi di dimensione arbitraria. Quale?Integer
non è 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