Haskell supporta valori sovraccaricati, in cui un singolo valore sovraccarico può comportarsi un po 'come una sovrapposizione di valori ognuno con un tipo diverso. Ad esempio, ecco una semplice classe di tipo:
class Truthy t where
truthy :: Integer -> t
instance Truthy Integer where
truthy x = x -- some computation that results in an Integer
instance Truthy Bool where
truthy x = x /= 0 -- some computation that results in a Bool
Il passaggio di un numero a truthy
restituisce un valore sovraccarico di tipo Truthy t => t
. Questo stesso valore può essere utilizzato come Integer
o Bool
:
Prelude> let y = truthy 17
Prelude> if y then y else 42
17
Si noti che y
viene utilizzato in un contesto Bool
(la condizione) e anche in un valore numerico
contesto (la clausola then
, che deve corrispondere al tipo del numerico else
clausola).
Haskell usa anche una valutazione pigra, quindi non è sorprendente che i due
i risultati di truthy 17
sono calcolati pigramente. Questo significa che mentre è sovraccarico
value è concettualmente un insieme di valori di tipi diversi, solo le istanze effettivamente utilizzate eseguono il calcolo.
Esistono linguaggi di programmazione con valori sovraccarichi come questo ma che utilizzano una valutazione rigorosa?
Se sì, quali sono le semantiche di valutazione dei valori sovraccaricati come? Sono valori sovraccaricati:
- strict (significa che devi eseguire calcoli per le istanze che non utilizzerai mai)
- non-strict (che sarebbe incoerente con valori non sovraccaricati)
- qualcos'altro?