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 ..)
18
demandé sur yairchu 2010-05-19 03:53:30

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.

14
répondu Travis Brown 2010-05-19 00:57:44