Il existe deux types de polymorphisme dans Haskell:
- polymorphisme paramétrique; et
- borné polymorphisme
Le premier est le plus général - une fonction paramétrique est polymorphe si elle se comporte de manière uniforme pour tous les types, dans au moins un de ses paramètres de type.
Par exemple, la fonction length
est polymorphe: elle renvoie la longueur d'une liste, quel que soit le type enregistré dans sa liste.
length :: [a] -> Int
Le polymorphisme est indiqué par une variable de type minuscule. Maintenant, si vous avez un comportement personnalisé que vous voulez avoir pour définir de types, alors vous avez un polymorphisme borné (également connu sous le nom "ad hoc"). Dans Haskell, nous utilisons des classes de types pour cela.
La classe déclare que la fonction sera disponible dans un ensemble de types:
class FunnyShow a where
funnyshow :: a -> String
et vous pouvez définir des instances pour chaque type que vous aimez:
instance FunnyShow Int where
funnyshow i = show (i+1)
et peut-être:
instance FunnyShow [Char] where
funnyshow s = show (show s)
Votre premier 'f' n'a pas le bon type. –
Voir aussi http://stackoverflow.com/questions/5671303/what-is-haskells-style-of-polymorphism –
@DonStewart: merci, c'est une faute de frappe. – aplavin