Haskell: Défaut de contraintes de type
considérons cet exemple:
applyKTimes :: Integral i => i -> (a -> a) -> a -> a
applyKTimes 0 _ x = x
applyKTimes k f x = applyKTimes (k-1) f (f x)
applyThrice :: (a -> a) -> a -> a
applyThrice = applyKTimes 3
Le 3
dans applyThrice
est sélectionnée par défaut par GHC à un Integer
, comme indiqué lors de la compilation avec -Wall
:
Warning: Defaulting the following constraint(s) to type 'Integer'
'Integral t'
arising from a use of 'applyKTimes'
donc je suppose que Integer
est la valeur par défaut Integral a => a
.
- Existe-t-il un moyen de définir les "types par défaut" pour d'autres contraintes également?
- est-ce que l'utilisation des types par défaut est une mauvaise pratique? (elle ne se plaignent lors de l'utilisation de
-Wall
..)
1 réponses
Oui, vous pouvez , bien que ce ne soit pas aussi simple que d'ajouter un défaut par classe de typographie, et cela ne fonctionne que pour Num
et ses sous-classes dans les bibliothèques Prelude
et standard. La syntaxe est default (t1, ..., tn)
, et une seule déclaration de ce type peut être utilisée par module.
ajouter default (Int)
, par exemple, changerait la valeur par défaut de Integral
dans votre code à Int
.
la valeur par défaut de (Integer, Double)
n'est pas seulement une politique de GHC: c'est le rapport Haskell 98 . (GHCi n'ont extension de règles par défaut , cependant.)
Voici une discussion de certains des problèmes avec le système actuel.