2011-06-08 4 views
5

J'ai trouvé des réponses expliquant la différence entre newtype et data dans Haskell. Mais si je le synonyme de type:type vs performance des données dans haskell

type Point = (Int,Int) 

Serait-ce plus efficace plutôt utiliser:

data Point = Pt (Int,Int) ? 
+5

voir http://stackoverflow.com/questions/5889696/difference-between-data-and-newtype-in-haskell, en particulier la partie de représentation. –

+0

J'ai vérifié cette question avant de mettre celui-ci. L'autre question est à peu près différente entre 'newtype' et' data' PAS entre 'type' et' data' – vis

+1

Envelopper le constructeur de données Pt avec une paire (,) dans 'data Point = Pt (Int, Int)' est inefficace. Il est préférable d'utiliser 'data Point = Pt Int Int'. Dans certains cas, vous pouvez également opter pour des Ints stricts. –

Répondre

7

L'utilisation type sera plus efficace, car il encourt une moins indirection que la version data.

Notez que les deux sont plus inefficaces que:

data Point = Point {-# UNPACK #-}!Int {-# UNPACK #-}!Int 

comme vous pouvez le voir sur cette question tout à l'heure data representations.

+0

se demander si cela est plus efficace, pourquoi n'est-il pas par défaut dans le langage – vis

+0

Modifie la sémantique, et rend certains programmes inappplicables. Par défaut/= Plus efficace. Au lieu de cela, la plupart des général. –

+1

A quelques exceptions près (note 'length' verses 'genericLength') –

5

Oui. La construction Pt ajoute un mot de surcharge (en GHC) et le champ (la paire) est stocké comme un pointeur vers une paire, en ajoutant un mot supplémentaire, pour un total de deux mots de surcharge (et une indirection supplémentaire pour arriver aux valeurs).

Je recommande que vous utilisez soit synonyme de type ou, mieux encore, définir

data Point = Pt {-# UNPACK #-} !Int {-# UNPACK #-} !Int 

Cela nécessite 4 mots moins

type Point = (Int, Int) 

et utilise un niveau moins indirections (pointeurs).