Debido a que un newtype
, en términos generales, funciona como type
en tiempo de ejecución y como data
en tiempo de compilación. Cada definición de data
agrega una capa adicional de direccionamiento indirecto, que, en circunstancias normales, significa otro lugar distinto donde algo se puede dejar como un thunk, alrededor de los valores que contiene, mientras que newtype
no lo hace. El "constructor" en un newtype
es básicamente una ilusión.
Cualquier cosa que combina múltiples valores en una sola, o que le da una elección entre varios casos, necesariamente se introduce una capa de indirección para expresar que, por lo que la interpretación lógica de newtype A = A Int Int
sería dos desconectados Int
valores con nada "manteniéndolas juntas" . La diferencia en el caso de newtype A = A (Int, Int)
es que la tupla misma agrega la capa adicional de direccionamiento indirecto.
Contraste esto con data A = A Int Int
contra data A = A (Int, Int)
.El primero agrega una capa (el constructor A
) alrededor de los dos Int
s, mientras que el segundo agrega la misma capa alrededor de la tupla, que a su vez agrega una capa alrededor de los Int
s.
Cada capa de indirección también generalmente agrega un lugar donde algo puede ser ⊥, así que considere los posibles casos para cada forma, ¿dónde? representa un valor no inferior:
Para newtype A = A (Int, Int)
: ⊥
, (⊥, ?)
, (?, ⊥)
, (?, ?)
Para data A = A Int Int
: ⊥
, A ⊥ ?
, A ? ⊥
, A ? ?
Para data A = A (Int, Int)
: ⊥
, A ⊥
, A (⊥, ?)
, A (?, ⊥)
, A (?, ?)
Como se puede ver de lo anterior, los dos primeros son equivalentes.
En una nota final, he aquí una divertida demostración de cuán newtype
difiere de data
. Tenga en cuenta estas definiciones:
data D = D D deriving Show
newtype N = N N deriving Show
¿Qué valores posibles, incluidos todos los posibles dos, tiene cada uno de estos? ¿Y cuál crees que serán los dos valores a continuación?
d = let (D x) = undefined in show x
n = let (N x) = undefined in show x
¡Cárguelos en GHC y descubra!
has leído [this] (http://www.haskell.org/haskellwiki/Newtype)? –
@ n.m., Gracias por el enlace, pero ¿podría dar más detalles sobre las preocupaciones prácticas? ¿Tiene que ver con emparejar '(A _ _)'? No entiendo por qué la equivalencia de la tupla llevaría a un comportamiento poco intuitivo. – gatoatigrado