2010-10-13 4 views
3

Tenir compte de ces (plus ou moins) les signatures de type équivalent:Utilisation du type Int et de la contrainte Integral. Avantage?

f1 :: [a] -> Int -> a 
f2 :: Integral b => [a] -> b -> a 

f2 est plus générale que f1, et qui est un gros avantage, mais est-il un avantage de f1 sur f2?

Il semble que dans les solutions aux H-99 problèmes, et dans de nombreux affichés solutions à divers problèmes d'Euler projet, le f1 forme apparaît beaucoup plus souvent que la f2.

Je ne sais pas pourquoi. Est-ce simplement paresse de programmeur, ou y a-t-il un coût de performance en allant avec la version plus générale (f2), ou y a-t-il une autre raison?

Répondre

8
  • Souvent, cela est dû aux personnes qui souhaitent utiliser l'intégrale conjointement avec les résultats de length et d'autres fonctions déjà limitées à Int. Bien qu'il existe souvent des fonctions generic * telles que genericLength, ces noms sont plus longs et ne figurent pas dans le Prélude.

  • Les performances de Int sont plus faciles à comprendre. Performance pour Integral a dépend d'une grande partie sur si la fonction se spécialise pour l'instance particulière de Integral.

  • Int est souvent non seulement suffisant mais aussi honnête. Par exemple, strict ByteString s ne peut pas être sur une taille Int (généralement, ne pas commenter avec des exemples ésotériques) en supposant que votre compilateur utilise le mot machine ou plus grand Int s et pas la norme reprise 29+ bits.

  • La surutilisation de classes de type salit les signatures, rendant le langage moins lisible. Si la généralisation extrême devenait commune, en particulier pour les fonctions primitives, je pense que nous aurions besoin de trouver une manière plus succincte d'exprimer les contraintes pour empêcher les programmeurs de devenir fous.

Questions connexes