GHC non è in grado di ricavare magicamente istanze per tipi di dati arbitrari. Tuttavia, lo può utilizzare il fatto che le dichiarazioni newtype
creano un nuovo nome per lo stesso tipo sottostante per derivare le istanze per quelli che utilizzano l'estensione GeneralizedNewtypeDeriving
. Quindi, si potrebbe fare qualcosa di simile:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype Something = Something Integer deriving (MyClass, Show)
class MyClass a where
hello :: MyClass a => a -> a
instance MyClass Integer where
hello i = i + 1
main = print . hello $ Something 3
La ragione GHC non può derivare la nuova istanza è che non sa che cosa l'istanza dovrebbe essere. Anche se il tuo tipo di dati ha solo un campo, potrebbe non essere lo stesso come quel campo. La possibilità di derivare istanze per newtype
s è conveniente, poiché esse sono solitamente utilizzate per fornire comportamenti diversi per determinati tipi di caratteri o come metodo per utilizzare il sistema di tipi per separare elementi che hanno lo stesso tipo ma usi diversi nel codice.
Non è necessaria la parte 'MyClass a =>' della firma del tipo per 'ciao'; è implicito dal fatto che 'a' viene reso noto da una dichiarazione di classe del modulo' classe MyClass a dove ... '. –
Dai un'occhiata alla [guida degli utenti di GHC sulla derivazione] (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#extensions-to-the-derder-mechanism). –