2011-06-08 19 views
5

Encontré respuestas que explican la diferencia entre newtype y data en Haskell. Pero si tengo el siguiente tipo sinónimo:tipo vs rendimiento de datos en haskell

type Point = (Int,Int) 

¿Sería más eficiente en lugar de usar:

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

ver http://stackoverflow.com/questions/5889696/difference-between-data-and-newtype-in-haskell, en particular, la parte de representación. –

+0

Revisé esa pregunta antes de poner esta. La otra pregunta es acerca de diferente entre 'newtype' y' data' NO entre 'type' y' data' – vis

+1

Envolver el constructor de datos Pt con un par (,) en 'data Point = Pt (Int, Int)' es ineficaz. Es mejor utilizar 'datos Point = Pt Int Int'. En algunos casos, también puedes optar por Ints estrictos. –

Respuesta

7

Usando type será más eficiente, ya que incurre en una vía indirecta menos que la versión data.

Tenga en cuenta que ambos son más ineficiente que:

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

como se puede ver en esta pregunta anterior sobre data representations.

+0

pregunto si esto es más eficiente, ¿por qué no está predeterminado en el lenguaje – vis

+0

Cambia la semántica y hace que algunos programas no se puedan implementar. Predeterminado/= Más eficiente. En cambio, el más general. –

+1

Con algunas excepciones (nota 'longitud' versos' genericLength') –

5

Sí.

La construcción Pt agrega una palabra de sobrecarga (en GHC) y el campo (es decir, el par) se almacena como un puntero a un par, agregando una palabra adicional, para un total de dos palabras (y una indirección adicional para llegar a los valores).

recomiendo que use o bien el tipo sinónimo o, mejor aún, definir

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

Esto requiere 4 palabras de menos de

type Point = (Int, Int) 

y utiliza un nivel menos de indirecciones (punteros).