2010-08-26 9 views
9

Tiene D 'newtype' (como en Haskell).¿Tiene D 'newtype'?

Es una pregunta ingenua, ya que estoy escaneando D, pero Google no encontró nada útil.

En Haskell esta es una forma de distinguir distintos tipos de elementos iguales en el tiempo de compilación, pero sin incurrir en penalizaciones de rendimiento en el tiempo de ejecución.

p. Ej. puedes hacer newtypes (dobles) para metros, segundos y kilogramos. Esto sería un error en tiempo de compilación si su programa agrega una cantidad en metros a una cantidad en segundos, pero sería tan rápido en el tiempo de ejecución como si ambos fueran dobles (que están en tiempo de ejecución).

Si D no tiene algo similar a 'newtype', ¿cuáles son los métodos aceptados para tratar cantidades dimensionadas?

Gracias,

Chris.

+0

Una clase de envoltura delgada con sobrecargas de operador apropiadas puede hacer el trabajo y optimizarlo. Pero eso es solo una suposición y una solución bastante fea. – delnan

+1

@delnan: En D probablemente usarías una estructura, no una clase. – dsimcha

+0

Por un momento pensé: "¿nuevo tipo? ... como en Gundam ????" XD – Klaim

Respuesta

12

En D1.0 hay typedef, que es la tipificación fuerte de un tipo predefinido a 'newtype'.

D2.0 ha eliminado esto y solo queda alias (qué typedef está en C). Se habla de tener una plantilla de contenedor que pueda crear un nuevo tipo.

El problema con typedef era que había buenos argumentos para hacer del tipo nuevo un subtipo del tipo predefinido, y también buenos argumentos para convertirlo en un super-tipo.

La semántica de typedef es que el tipo base se convierte implícitamente al newtype, pero el newtype no se convierte al tipo base u otros tipos con el mismo tipo de base. Estoy usando el tipo de base aquí desde:

typedef int Fish; 
typedef Fish Cat; 
Fish gold = 1; 
Cat fluff = gold; 

No se puede compilar.

Y a partir de ahora, 2.048 DMD todavía permite el uso de typedef (pero no lo use).

Tener el tipo de base de convertir a la newtype es útil para que usted no tiene que escribir

meters = cast(meters) 12.7; 
+1

En 'typedef X Y', si' X' es implícitamente convertible ao desde 'Y', entonces' typedef' no es muy parecido a 'newtype' de Haskell. –

+0

@Leer Barton, acepté esta respuesta como una respuesta de "no, no". – fadedbee

+0

@he_the_great, ¿cuáles son los argumentos a favor de que el nuevo tipo sea un supertipo? ¿Podríamos tener tanto subtipodef como supertypedef en el idioma? – fadedbee

6

divertido, como he_the_great menciones, D1 tenía un fuerte typedef pero nadie lo utilizó, posiblemente porque era imposible para personalizar la semántica exacta para cada caso. Posiblemente, la forma más sencilla de manejar esta situación, al menos para los tipos primitivos, es incluir una plantilla mixin en algún lugar de Phobos que le permita reenviar todos los operadores pero tenga el modelo repetitivo para hacerlo automáticamente a través de mixin. Entonces solo crearías una estructura de contenedor y estarías listo.